Dans ton exemple :
1ere passe
-debut : step = 0
-entre dans la boucle for
step = 0+1 = 1
nbr dans {0-10}
element[0] choisit si nbr=0 (une chance sur onze, ca part mal)
probablitié de choix de element[0]: 1/11
2eme passe (si nbr<>0)
- debut step=1
- boucle : step=1+1=2
nbr dans {0-10}
element[1] choisit si nbr<2 (deux chances sur onze, on est pas beau)
probabilité de choix de element[1] : 10/11*2/11=20/121 (le premier nbr n'est pas 0 et le second est 0 ou 1)
3eme passe (si nbr<>0 puis nbr<>0 et nbr<>1)
-debut step=2
- boucle : step=2+2=4
nbr dans {0-10}
element[2] choisit si nbr<4 (4 chances sur 11)
probabilité de choix de l'element[2] : 10/11*9/11*4/11= 360/1331 ( premier nbr différent de 0, deuxième nbr différent de 0 ou 1, troisième nbr est 0,1,2 ou 3)
etc.
Allez une solution qui marche en pseudo code :
$total=0;
pour $element dans $dico
($total=$total+$element.valeur;)
fin pour;
$index=aleatoire(1-$total); #nombre entier aléatoire entre 1 et $total inclus
$i=1;
$postition=0;
tant que $i<$index
($i=$i+$dictionnaire[$position].valeur;
$position=$position+1;)
fin tant que;
renvoit $position;
Dans le cas particulier cité en exemple on aura bien un $total à 10
donc $index sera compris entre 1 et 10
si $index vaut 1 : pas d'execution de la boucle (1<1 est faux), le système renvoit $postion=0
La position 0 a une chance sur 10 d'être choisie ($index=1)
si $index vaut 2, un passage dans la boucle (1<2 est vrai), $i passe à 2 (1+$dictionnaire[0].valeur) et pas de deuxième passage dans la boucle. Le système renvoit $position=1
La position 1 a une chance sur dix d'être choisie ($index=2)
si index vaut 3 ou 4 : 2 passage dans la boucle :
init : $i=1
première passe : $i=2
seconde passe : $i=4 et (4<4 est faux)
Le système renvoit $position=2
la position 3 a deux chances sur dix d'être choisie ($index=3 ou $index=4)
# Faux, absurde et debordement
Posté par Jerome Herman . En réponse au journal Tirage aléatoire dans un tableau. Évalué à 4.
1ere passe
-debut : step = 0
-entre dans la boucle for
step = 0+1 = 1
nbr dans {0-10}
element[0] choisit si nbr=0 (une chance sur onze, ca part mal)
probablitié de choix de element[0]: 1/11
2eme passe (si nbr<>0)
- debut step=1
- boucle : step=1+1=2
nbr dans {0-10}
element[1] choisit si nbr<2 (deux chances sur onze, on est pas beau)
probabilité de choix de element[1] : 10/11*2/11=20/121 (le premier nbr n'est pas 0 et le second est 0 ou 1)
3eme passe (si nbr<>0 puis nbr<>0 et nbr<>1)
-debut step=2
- boucle : step=2+2=4
nbr dans {0-10}
element[2] choisit si nbr<4 (4 chances sur 11)
probabilité de choix de l'element[2] : 10/11*9/11*4/11= 360/1331 ( premier nbr différent de 0, deuxième nbr différent de 0 ou 1, troisième nbr est 0,1,2 ou 3)
etc.
Allez une solution qui marche en pseudo code :
$total=0;
pour $element dans $dico
($total=$total+$element.valeur;)
fin pour;
$index=aleatoire(1-$total); #nombre entier aléatoire entre 1 et $total inclus
$i=1;
$postition=0;
tant que $i<$index
($i=$i+$dictionnaire[$position].valeur;
$position=$position+1;)
fin tant que;
renvoit $position;
Dans le cas particulier cité en exemple on aura bien un $total à 10
donc $index sera compris entre 1 et 10
si $index vaut 1 : pas d'execution de la boucle (1<1 est faux), le système renvoit $postion=0
La position 0 a une chance sur 10 d'être choisie ($index=1)
si $index vaut 2, un passage dans la boucle (1<2 est vrai), $i passe à 2 (1+$dictionnaire[0].valeur) et pas de deuxième passage dans la boucle. Le système renvoit $position=1
La position 1 a une chance sur dix d'être choisie ($index=2)
si index vaut 3 ou 4 : 2 passage dans la boucle :
init : $i=1
première passe : $i=2
seconde passe : $i=4 et (4<4 est faux)
Le système renvoit $position=2
la position 3 a deux chances sur dix d'être choisie ($index=3 ou $index=4)
etc.