• [^] # Re: rand($.) < 1 && ($line = $_) while <>

    Posté par . En réponse au message Accès aléatoire à un fichier d'un répertoire. Évalué à 3.

    tu te trompè-je.
    On reprend (d'ailleurs l'algo est vraiment astucieux je trouve)


    i = 1;
    while (file = next_file()) {
    if (rand(i) < 1)
    result = file;
    i++;
    }


    Donc, tu prends result qui au début ne contient rien.
    Puis, tu as result qui fait effectivement file1.
    Ensuite, tu as une chance sur deux pour que result prenne la valeur file2, puisque tu as une chance sur deux pour avoir rand(2) < 1, et l'autre chance est à file1.
    Donc pour l'instant, ça marche pour deux fichiers dans next_file()

    Si ça marche pour n fichiers, tu as alors une chance sur n d'avoir result=filex, avec x entre 1 et n.
    Bon, on rajoute un fichier. On fait donc une nouvelle boucle. Tu as alors 1/(n+1) chance de tomber sur rand(n+1) < 1.
    Et les autres valeurs de result suivent du même coup (cette étape je saurai pas te l'expliquer simplement, j'ai laissé mes maths de côté depuis trop longtemps, mais on sent bien que c'est ce que ça fait).

    Donc ça marche.