On appelle l'opération un "tirage sans remise".
Petite remarque au passage concernant le temps d'exécution dans certains cas (qui n'est absolument pas de l'auto-promotion du quatrième lien fourni par Tlem).
L'idée mise en oeuvre dans le code du lien 3 est correcte mais demande un temps de calcul potentiellement énorme dans le cas où le nombre de jetons disponibles est important et où le nombre de jetons désirés est proche du maximum.
Ainsi, si on veut tirer sans remise 4995 jetons d'un ensemble de 5000, on se retrouve vite avec un tableau $melange qui contient presque tous les nombres que Random() va sortir, d'où une répétition croissante du nombre de boucles qui produisent des Random() qu'on a déjà. On peut pallier à la chose en inversant le problème et en choisissant les 5 jetons à ne pas sortir, ce qui est correct, mais le problème est maintenant que le reste des jetons devrait être annoncé de façon aléatoire si on ne veut pas d'une énumération en séquence croissante.
L'algorithme (4) ci-dessus est linéaire dans tous les cas. Je n'ai pas eu le temps de regarder les 2 premiers.
Une autre possibilité efficace est d'itérer dans les jetons en séquence et de tirer pour chacun une probabilité de sortie. On a ainsi en plus la certitude de finir le tirage dès que le nombre de jetons voulus est sorti, souvent avant l'itération complète.
Exemple :
► Afficher le texte
Code : Tout sélectionner
; jetons numérotés de 1 à 9999
; on veut un tirage semi-aléatoire de 20 jetons
#include <Array.au3>
Local Const $Nmax = 9999
Local Const $Nsortie = 20
Local Const $proba = $Nsortie / $Nmax
Local $tirage[$Nsortie]
Local $i = 1, $n = 0
Do
If Random() < $proba Then
$tirage[$n] = $i
$n += 1
EndIf
$i += 1
If $i > $Nmax Then $i -= $Nmax
Until $n = $Nsortie
_ArrayDisplay($tirage)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.