Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

alexbej

XLDnaute Nouveau
Bonjour,

Je cherche à générer une chaîne de chiffres semi-aléatoires, et plus précisément, à contrôler selon une variable la façon dont l'aléatoire est généré. Je m'explique: j'ai des histoires (dans la colonne A), qui appartiennent à 5 catégories différentes (a,b,c,d,e). Pour chaque catégorie, j'ai une quarantaine d'histoires. Je souhaiterai que l'ordre de l'ensemble des histoires (des 200 donc) soit aléatoire tout en évitant qu'il y ait une répétition de plus de 3 histoires d'une même catégorie (autrement dit je souhaite obtenir une chaîne comme a,d,e,a,c,c,b,e,d,e... et éviter une chaîne comme a,c,d,e,b,a,a,a,,e...).
Je suppose qu'il faut que j'associe à chaque histoire de la colonne A, une valeur aléatoire dans la colonne B qui me servira ensuite de tout trier. J'ai trouvé les fonctions =ALEA() et =ALEA.ENTRE.BORNES() , qui permettent de générer des chiffres aléatoires, mais aucun critère additionnel ne peut être établi. Est-ce possible de faire ça dans excel?? Une idée pour me permettre de respecter ce critère de non-répétition plus de 3 fois??

D'avance, merci beaucoup pour votre aide.
Alexandre
 

alexbej

XLDnaute Nouveau
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Merci BrunoM45 de prendre le temps de me répondre.
Mais du coup, la formule =ALEA.ENTRE.BORNES() génère un chiffre aléatoire mais ne vas pas permettre d'éviter qu'il y ait une non-répétition d'une même catégorie. Peut-être mon précédent message n'était pas suffisamment clair. Ce que je cherche à faire, c'est classer mes 200 histoires de façon aléatoire mais en ÉVITANT d'avoir plus de 3 fois successivement une même catégorie. Si je les classe en utilisant la formule =ALEA.ENTRE.BORNES(), je vais potentiellement rencontrer ce problème...
 

KenDev

XLDnaute Impliqué
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Bonjour Alex, Bruno

Une possibilité laborieuse dans le fichier joint. Mode d'emploi : appuyer sur le bouton, aller préparer un café, une réponse devrait être affichée en H1 au retour. Faire alors de suite un copier spécial valeur de la réponse autre part.

La macro associée au bouton ne fait que simuler l'appui sur la touche F9. Cette approche est possible car les conditions sont "raisonnables" (5 catégories, environ 40 éléments). Avec d'autre paramètres cette méthode risque de ne jamais aboutir.

Cordialement

KD.
 

Pièces jointes

  • HistA.xls
    305.5 KB · Affichages: 144

MichD

XLDnaute Impliqué
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Bonjour,

Regarde le fichier suivant : http://cjoint.com/?BFEvVjYQSFP

N.B. Comme l'ordre de tirage est aléatoire, il se peut fort bien que les 5 ou 10
derniers tirages, tu obtiennes une série d'une même catégorie. La fréquence
avec laquelle les catégories sortent au moment du tirage n'est pas régie.
La seule condition, c'est qu'il ne doit pas y avoir plus de 2 sorties consécutives
de la même catégorie...Que doit-il se passer si pour terminer 200 tirages, les 2 ou
10 dernières sorties appartiennent toutes à la même catégorie?

Si tu tiens avoir une fréquence de sortie comparable pour chacune des catégories,
tu fais 40 tirages de 5 éléments tous différents. Dans chaque tirage, chaque
catégorie est représentée au moins une fois.
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Bonjour le fil

Merci BrunoM45 de prendre le temps de me répondre.
Mais du coup, la formule =ALEA.ENTRE.BORNES() génère un chiffre aléatoire mais ne vas pas permettre d'éviter qu'il y ait une non-répétition d'une même catégorie. Peut-être mon précédent message n'était pas suffisamment clair. Ce que je cherche à faire, c'est classer mes 200 histoires de façon aléatoire mais en ÉVITANT d'avoir plus de 3 fois successivement une même catégorie. Si je les classe en utilisant la formule =ALEA.ENTRE.BORNES(), je vais potentiellement rencontrer ce problème...
Désolé, Alex je n'ai pas été assez explicite et toi pas assez curieux ;)

Dans mon fichier il y'a une macro qui génère un tirage de 20 histoires, il suffit de l'exécuter

A+
 

alexbej

XLDnaute Nouveau
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Bonjour BrunoM45, MichD & KenDev,

Merci beaucoup pour vos réponses et le temps que vous prenez pour m'aider.

Tout d'abord, mes excuses BrunoM45 de ce manque de futilité!! C'est vrai que j'ai un peu manqué de curiosité sur ce coup là (et/ou négligé les compétences de mon interlocuteur!). Je viens donc d'essayer ta macro qui tourne sans problème mais dont je n'arrive pas à étayer la validité car je ne peux sélectionner le tirage pour le coller dans une colonne et voir s'il n'y a pas plus de 3 répétitions d'une même catégorie. Mes compétences d'écriture de macro étant très limitées, je n'arrive pas à coller le tirage dans une colonne annexe. Est-ce possible pour que je puisse ensuite trier mes données et vérifier que cela fonctionne bien?

KenDev, ta macro fonctionne bien dans le sens où elle génère correctement ce que je souhaite. Par contre sa mise en application me semble un peu compliqué. MichD, je ne sais pourquoi, mais je n'arrive pas à faire tourner la macro que tu m'as envoyée: je remplis la colonne A de a,b,c,d,e (qu'il compte correctement dans la colonne D), mais quand je lance la macro, il me dit qu'il y a une erreur de compilation (Projet ou bibliothèque introuvable).

Pour rendre ma demande plus claire et pour que votre aide puisse m'être la plus pratique possible, je vous mets en pj un fichier exemple. Ce qui serait super, c'est une macro qui me permette de générer dans la colonne E cette chaine de chiffres semi-aléatoires. Si, c'est possible, j'aimerai pouvoir définir en D2 le nombre maximal de répétition d'une même catégorie et dans la colonne C mes différentes catégories dont je ne souhaite pas la répétition successive plus d'un certain nombre de fois (nombre de fois, définis donc dans le colonne D2). Dans la colonne B, il y aurait la catégorie de chaque histoire. En fait, il n'est pas impossible que j'ai plus de 5 catégories et aussi que je n'ai pas le même nombre d'histoires (colonne A) dans chacune d'entre elles. Peut-être ça en rajoute à la difficulté...

A nouveau, merci pour votre aide et le temps que vous m'accorder.
Cordialement,

alexandre
 

Pièces jointes

  • Classeur_semi-random.xlsx
    11 KB · Affichages: 128
Dernière édition:

KenDev

XLDnaute Impliqué
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Bonjour à tous,

@Alexandre : C'est toujours un peu désagréable, après avoir répondu correctement à une question, de s'entendre dire 'ah oui c'est bien mais en fait ma vrai question n'était pas celle là'.

Ceci dit ci joint un classeur répondant au nouvel énoncé (sauf erreur). Je me suis basé sur le classeur fournit et non sur sa description (les deux ne correspondent pas quand il s'agit de définir ou doit on lire le nombre de répétition maximal , où l'on doit écrire)

J'ai mis 6 catégories avec 6 quantités différentes à titre d'exemple.

Cordialement

KD
 

Pièces jointes

  • abj.xls
    46.5 KB · Affichages: 136

alexbej

XLDnaute Nouveau
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Bonjour,

Merci KevDev et désolé d'avoir suscité ton courroux de par ma maladresse. Je me suis sûrement mal expliqué dans mon premier message et j'ai voulu remédier à ça dans mon dernier message en donnant une feuille exemple. Ta macro marche impeccablement et correspond tout à fait à ce que je voulais. Je te remercie donc beaucoup.

Pour info MichD, j'ai réussi à lancer ta macro. Il y a un léger problème dans le sens ou tout est bien comme il faut jusqu'aux dernières lignes ou il y a à chaque fois une répétition d'une même catégorie (je suppose que c'est la catégorie, qui par le fait du hasard, a été sous représentée dans le début-milieu de la chaine).

Merci encore à vous trois et bon dimanche.
Alexandre
 

KenDev

XLDnaute Impliqué
Re : Générer chiffres pseudo-aléatoire (aléatoire avec un critère)

Re,

Attention, un coquille : la ligne
Code:
Refaire:
est mal placée, la déplacer après la ligne
Code:
If r < 3 Then Exit Sub

Cordialement

KD

VB:
Option Explicit

Sub AJA()
Dim a&, Tc&(), r&, i&, Th$(), b&, Tr$(), c&, d As Boolean, Rg As Range, e%, Rep&
    Rep = Cells(2, 3)
    r = Cells(Rows.Count, 2).End(xlUp).Row
    If r < 3 Then Exit Sub
Refaire:
    ReDim Tc(1 To 1): a = 1: Tc(a) = 1: ReDim Th(1 To 2, 1 To r - 1): Th(1, 1) = Cells(2, 1): Th(2, 1) = Cells(2, 2)
    For i = 3 To r
        If Cells(i, 2) <> Cells(i - 1, 2) Then
            a = a + 1: ReDim Preserve Tc(1 To a): Tc(a) = 1
        Else
            Tc(a) = Tc(a) + 1
        End If
        Th(1, i - 1) = Cells(i, 1): Th(2, i - 1) = Cells(i, 2)
    Next i
    Randomize
    Do
        e = 0
        Do
            e = e + 1
            b = Int(UBound(Th, 2) * Rnd) + 1
            If c >= 2 Then
                d = False
                For i = 0 To Rep - 2
                    If Th(2, b) <> Tr(2, c - i) Then d = True: Exit For
                Next i
            End If
            If e > r Then GoTo Refaire
        Loop Until c < Rep Or d
        c = c + 1: ReDim Preserve Tr(1 To 2, 1 To c)
        Tr(1, c) = Th(1, b): Tr(2, c) = Th(2, b)
        If c = r - 1 Then Exit Do
        For i = b To UBound(Th, 2) - 1
            Th(1, i) = Th(1, i + 1): Th(2, i) = Th(2, i + 1)
        Next i
        ReDim Preserve Th(1 To 2, 1 To UBound(Th, 2) - 1)
        a = 0
        For i = 1 To UBound(Tc)
            If b > Tc(i) + a Then a = a + Tc(i) Else Tc(i) = Tc(i) - 1: Exit For
        Next i
    Loop Until c = r - 1
    For i = 1 To UBound(Tr, 2)
        Cells(i + 1, 4) = Tr(1, i)
    Next i
End Sub
 

Discussions similaires

Réponses
6
Affichages
423

Statistiques des forums

Discussions
312 241
Messages
2 086 519
Membres
103 241
dernier inscrit
Peyo33