• # Faux, absurde et debordement

    Posté par . En réponse au journal Tirage aléatoire dans un tableau. Évalué à 4.

    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)

    etc.