Je me fais actuellement la main en programmation et au détour d'un de mes tests je souhaite effectuer un tirage au sort. Pour l'instant je suis sur quelque chose de très simple car je tire au hasard un nombre dans un intervalle de 0 à 99, ce qui donne si je ne me trompe pas 1% de chance à chaque numéro de sortir.
Étant une bille dans ce genre de calculs, ma première question est "est-ce bien 1%?".
Là où ça se complique c'est que je souhaite attribuer des paliers de "rareté" à certains intervalles. Je pensais faire un second tirage en fonction de l'intervalle du nombre qui sort au premier tirage.
Par exemple, si un nombre compris entre 50 et 80 sort, j'effectue un second tirage avec 1/2 de chance de valider le premier tirage.
J'aimerai effectuer ça avec plusieurs palier du type 1/10, 1/100, 1/1000.
Pouvez-vous m'aider à déterminer la formule pour calculer le % de chance qu'un nombre sorte après un second tirage en fonction des paliers s'il vous plait?
Par exemple, si un nombre compris entre 50 et 80 sort, j'effectue un second tirage avec 1/2 de chance de valider le premier tirage.
Qu'est-ce que tu entends par valider ? Que le second nombre soit lui aussi compris entre 50 et 80 ?
Et qu'appelles-tu un palier ? Le 1/2 de chance, c'est ça que tu appelles un palier ?
Getrox a écrit:
Pouvez-vous m'aider à déterminer la formule pour calculer le % de chance qu'un nombre sorte après un second tirage en fonction des paliers s'il vous plait?
Le second tirage est indépendant du premier, donc je ne vois pas trop ce que tu veux calculer.
J'aimerai effectuer un premier tirage 1 nombre au hasard sur 100 (de 0 à 99).
Et ensuite, si le nombre tiré est disons supérieur à 50, y appliquer un deuxième tirage pour le rendre plus dur à valider. Par valider j'entends lui faire passer une seconde condition. La première étant d'être tiré parmi les 100 nombres.
En code (Ruby), si ça peut aider à clarifier mes propos, j'imagine un truc comme ça: - 1er tirage:
rand(100)
- Disons que ça me renvoie 51. J'y applique donc un second tirage de "validation" qui pourrait être un truc du genre:
if nombre > 50
validation = rand(10)
if validation == 0
nombre validé
else
boucle a partir du premier tirage
end
end
Dans cet exemple j'y applique un 2e tirage avec 1 chance sur 10.
Si je ne dis pas de bêtises, il me suffit d'augmenter mon rand() pour augmenter la difficulté de "validation" et ainsi créer des paliers (rand(10), rand(100), rand(1000)). Par palier j’entends avoir des nombres plus simples à sortir que d'autres. Dans cet exemple il est plus simple de "valider" un nombre de 0 à 50 que de 51 à 99.
Il y a sûrement plus simple/propre pour augmenter la difficulté de "validation" d'un nombre, mais pour l'instant mon cerveau n'a pondu que cette façon de faire.
Pour le calcule, sachant qu'il y a tant de chance au premier tirage et tant de chance au second, je présume qu'on peux en déduire un % de chance total de "validation" d'un nombre. Un peu comme calculer le % de chance de faire deux fois face en lançant une pièce deux fois.
Désolé, je n'ai pas le jargon math, j'espère que j'ai été plus clair.
Edit: En écrivant le truc sur la pièce j'ai tilter.
Avec l'exemple du rand(10) est-ce que la réponse ne serait pas: - Premier lancé 1/100 - Deuxième lancé 1/10 Et donc (1/100)x(1/10) = 1/1000?
Et si on faisait les choses à l'envers ... Disons que je veux qu'un nombre entre 0 et 50 ait une probabilité de 75% de sortir contre 25% pour entre 51 et 99 Je fais un rand(100) Si le nombre est dans le premier intervalle (0, 74, je lui associe l'intervalle 0,50 et je fais un trand0,50) (je ne sais pas si ça existe en Ruby, je pense au randint() de Python) Si le nombre est dans le second intervalle (75, 99), je fais un rand(51, 99) Si tu as plusieurs intervalles, le problème sera de parcourir la liste des intervalles avec le nombre obtenu lors du premier tirage. À l'issue de ce parcours, on obtient un numéro d'intervalle et on lui associe un autre intervalle. On pourrait même associer une liste d'intervalles au second niveau également.
Le Tout est souvent plus grand que la somme de ses parties.
Je donne suite à ma suggestion. C'est mon preemier programme en Ruby, soyez indulgents. - # Probabilités relatives. prob = [40, 40, 20] puts(prob.to_s()) # Valeurs associées à chaque intervalle. vals = [[0, 9], [19, 36], [53, 113]] # Seules les valeurs dans les intervalles seront choisies. # Probabilités cumulatives pour l'algorithme. for i in 1...prob.length() prob[i] = prob[i-1] + prob[i] end puts(prob.to_s());puts("") r = rand(prob[-1]) puts(r) # Trouver le bon intervalle. for i in 0...prob.length() if r < prob[i] p = i break end end puts(p) # Valeur aléatoire correspondante. n = rand(vals[p][1] - vals[p][0] + 1) + vals[p][0] puts(n) - [40, 40, 20] [40, 80, 100]
52 1 28
Le Tout est souvent plus grand que la somme de ses parties.
@WhiteCrow, je cherche à tirer aléatoirement des nombres dans un tableau en faisant en sorte que certains aient moins de chance de sortir que d'autre. Mais au cours de l’exposé de mon problème j'ai résolu ce premier soucis. Maintenant je cherche à calculer les %.
@PierroLeFout, merci pour ta suggestion qui semble fonctionnelle, mais j'avoue que je ne comprend pas trop ce qu'elle renvoi ^^'.
De toute manière, mon code fonctionne. Je cherche juste à calculer les % pour que je puisse l'ajuster correctement.
Donc pour simplifier tout ce problème que j'ai exposé de la mauvaise manière depuis le début, on peut voir ma question sous cette angle:
Imaginons j'ai 1d100 et 1d10 Comment calculer les probabilités de tirer un 1 sur le d100 suivie d'un second 1 sur le d10. Et je crois que la réponse c'est simplement 1/100 x 1/10 = 1/1000
WhiteCrow a posé la bonne question : que veux-tu faire ?
Tu as très partiellement répondu. On sait que tu veux tirer un nombre entre 0 et 99 ... mais tu veux que certains nombres sortent plus souvent que d'autres.
Je pense deviner que tu veux que les petits nombres sortent plus souvent que les gros, mais on n'est pas là pour tourner en rond et deviner ce que tu veux :)
Pour ta dernière question (1 d100 et 1 d10 ...), la réponse est oui.
@tbc92 effectivement ne perdons pas de temps à deviner ce que je veux alors que je l'ai énoncé. A savoir "On sait que tu veux tirer un nombre entre 0 et 99 ... mais tu veux que certains nombres sortent plus souvent que d'autres" comme tu l'as dis. Je ne veux pas particulièrement que les plus petits, que les plus grands, que les paires ou impairs sortent plus ou moins.
Si ça intéresse quelqu'un voici un code qui fait le taff:
validation = false
while validation != true
# on tire aléatoirement un nombre
alea_nb = rand(100) # 0 - 99
# on passe au deuxième tirage pour augmenter la difficulté
if alea_nb > 50 # condition a modifier (intervalle, <, >, =, etc).
validation = true
elsif alea_nb < 50 # condition a modifier (intervalle, <, >, =, etc).
alea_validation = rand(10) # modifier le rand en fonction du taux de chance que l'on veut obtenir
if alea_validation == 0
validation = true
end
end
end
"Pour ta dernière question (1 d100 et 1 d10 ...), la réponse est oui."
Parfait j'ai tout ce qui me fallait
Merci à tous pour l'aide apportée à la résolution de mon problème. Une agréable journée à vous.
- Edité par Getrox 7 août 2021 à 16:03:39
Calcul de probabilités
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.