VBA - tirage aléatoire avec proba

"Ex : tirage aléatoire entre 1 et 5 mais le 5 a plus de chance de sortir que le 4, le 4 que le 3 etc."

Bonjour à tous,

Voici ma requête :

Je veux effectuer en VBA un tirage aléatoire parmi des valeurs définies, mais je veux attribuer une sorte de pondération

Prenons exemple :

valeurs définies : 1-5

1 = x% de proba d'être choisi

2 = y% de proba d'être choisi

3 = z% de proba d'être choisi

4 = a% de proba d'être choisi

5 = b% de proba d'être choisi

je sais faire un tirage aléatoire comme ceci, il reste à compléter le code mais je n'ai trouvé nul part comment procéder.

Je pense qu'il faut changer le "RANDOMIZE" avec une partie de code.

Sub aleatoire()

    'Initialiser le générateur de nombres aléatoires
    '=> Randomize : à ajouter avant d'utiliser Rnd pour obtenir des valeurs complètement aléatoires
    Randomize

    'Nombre aléatoire entier entre 1 et 5 :
    nombre_aleatoire = Int(5 * Rnd) + 1

    MsgBox nombre_aleatoire

End Sub

Merci!

Bonne journée

Bonjour,

fait-toi une liste des % cumulés et recherche la position du rnd() dedans avec match (equiv en français) :

nombre_aleatoire = Evaluate("MATCH(" & Rnd() & ",{0;0.1;0.3;0.7;0.9},1)")

Pourcentages ici :

1 : 0.1-0 = 10%

2 : 0.3-0.1 = 20%

3 : 0.7-0.3 = 40 %

4 : 0.9-0.7 = 20%

5 : 1-0.9 = 10 %

eric

Merci pour votre réactivité eriiic.

Le problème c'est que cela me fait une erreur de syntaxe.

cf : fichier joint

Pourcentages ici :

1 : 0.1-0 = 10%

2 : 0.3-0.1 = 20%

3 : 0.7-0.3 = 40 %

4 : 0.9-0.7 = 20%

5 : 1-0.9 = 10 %

c'était pour t'expliquer le {0;0.1;0.3;0.7;0.9} de la formule, les pourcentages obtenus pour 1 à 5 dans ce cas. Ce n'est pas du code à mettre.

Et si tu regardes bien je n'y ai mis que des nombres <1 car rnd() te retourne un nombre dans [0 , 1[ ( de 0 inclus à 1 exclu)

Et toi tu vas mettre {1;2;3;4;5} ce qui n'a rien à voir.

Je t'ai dis : une liste des % cumulés

Pour rappel 10% c'est 0.1, 15% c'est 0.15 etc

C'est plus clair pour toi ?

D'accord,

Sauf que selon ton exemple, ça va choisir un des pourcentages parmi {0;0.1;0.3;0.7;0.9}.

Je ne veux pas avoir une valeur de pourcentage, je souhaite obtenir une des valeurs définies : dans mon exemple il y'a le choix entre 1,2,3,4 et 5.

par contre, je veux affecter une probabilité de tirage de ces 5 valeurs. Je ne sais pas (encore) comment faire cela.

En gros quand j'appuie sur le bouton qui active la macro, ça tire un des 5 chiffres sus-mentionnés, sachant que lesdits chiffres n'ont pas la même proba de sortir selon les valeurs de probas que j'aurai défini.

edit : j'ai compris le principe, mais comment je peux retourner la valeur 2 dans mon code si par exemple le tirage est entre 0.1 et 0.3 (donc techniquement, 20% de chance de trouver la valeur 2) ?

Sauf que selon ton exemple, ça va choisir un des pourcentages parmi {0;0.1;0.3;0.7;0.9}.

J'ai dit ça moi ? Non, pas de tout, relis les explications.

C'est le cumul des % pour 1, 2, 3, 4 et 5

Si tu testais en mettant la ligne de code telle que je te l'ai mise sans rien changer déjà ?

Je ne comprends pas vos explications sinon il n'y aurait pas de problème...

Sub alea_click()

    'Initialiser le générateur de nombres aléatoires
   '=> Randomize : à ajouter avant d'utiliser Rnd pour obtenir des valeurs complètement aléatoires
   Randomize

    'Nombre aléatoire entier entre 1 et 5 :
   nombre_aleatoire = Evaluate("MATCH(" & Rnd() & ",{0;0.1;0.3;0.7;0.9},1)")

    'afficher le nombre aléatoire dans le TB du formulaire
    TB_nombre = nombre_aleatoire

End Sub

J'ai ajouté votre ligne de code. Cela ne marche pas. Cela fait erreur d'exécution, impossible de définir la propriété value. Le type ne correspond pas.

C'est normal que cela ne fonctionne pas, vu que nul part n'est indiqué mes valeurs 1,2,3,4 et 5.

remplace

TB_nombre = nombre_aleatoire

par

MsgBox nombre_aleatoire

si tu veux tester ma ligne de code...

Chez moi ça retourne bien de 1 à 5 dans les proportions que j'ai imposé.

Et n'hésite pas à commencer à les lire le B.A.BA de VBA si tu veux programmer.

Il y a des bases à acquérir (déclaration, type et portée des variable, c'est le minimum), et il faut apprendre à déboguer (pas à pas, contrôle des variables, etc) également si tu veux t'y retrouver. Tu gagneras ton temps


EDIT :

C'est normal que cela ne fonctionne pas, vu que nul part n'est indiqué mes valeurs 1,2,3,4 et 5.

C'est surtout que tu n'as rien compris au fonctionnement et tu changes des trucs sans comprendre, ni même simplement testé sans changer quoique ce soit

j'ai un peu plus de temps, je vais essayer de t'expliquer un peu différement.

Tu as

1, 2, 3, 4, 5 que tu veux tirer avec les % suivants :

10% 20% 40%, 20% 10%

pourcentages que l'on peut écrire également :

0.1 0.2 0.4 0.2 0.1

Tu fais les totaux successifs des % tu obtiens :

0.1 (0.1+0.2) (0.1+0.2+0.4) (0.1+0.2+0.4+0.2) (0.1+0.2+0.4+0.2+0.1) c'est à dire :

0.1 0.3 0.7 0.9 1

pour la liste on n'a pas besoin du dernier qui sera toujours 1 (total 100%), mais elle doit toujours démarrer par 0 (pour le fonctionnement de Match() ) ce qui donne :

0 , 0.1 , 0.3 , 0.7 , 0.9

Rnd() donne un nombre aléatoire <1, prenons 0.25 par exemple

Match va rechercher le nombre le plus proche et inférieur à 0.25, soit 0.1 et te retourner sa position dans la liste. Il te retournera donc 2, et ne pourra te retourner que des nombres entiers entre 1 et 5 puisque la liste a 5 valeurs (positions).

Au passage tu remarques que tu obtiendras 1 pour 0<=rnd()<0.1

2 pour 0.1<=rnd()<0.3 soit 2 fois plus souvent que de 1

3 pour 0.3<=rnd()<0.7 soit 4 fois plus souvent que de 1

ce que est bien ce qu'on a choisi

Bonjour eriiic,

Merci pour votre attention particulière.

Je suis désolé j'ai peu de temps à accorder à la programmation. J'ai conscience que cet univers est passionnant, j'essayerai d'étudier les rudiments techniques du language informatique avec un peu plus de temps dans mon bureau (ce qui semble utopique).

Je ne veux pas une MSg box, je souhaite que la donnée soit inscrite dans une Textbox car après je vais effectuer un calcul à partir de cette textbox : tout est fait dans mon Userform.

Avec une Msg box, je ne pourrai pas récolter la valeur (1 2 3 4 ou 5) et effectuer des calculs subsidiaires dessus.

C'est fou, je suis intégré dans une grande entreprise et sur le site ou je suis actuellement affilié, sur 1000 personnes, il n'y a pas un seul spécialiste de programmation Excel.

Bonjour,

Je ne veux pas une MSg box,

Purée, mais c'est juste pour que tu vois enfin que le résultat est conforme à ce que tu as demandé.

Après ce que tu en fais et comment tu l'utilises ça te regarde et ce n'est plus l'objet de la question.

Regarde ce fichier de test et si tu es enfin d'accord :

eric

260classeur2.xlsm (25.65 Ko)
Rechercher des sujets similaires à "vba tirage aleatoire proba"