The front page All those lovely tutorials Other sites of interest More info about Stickman
Stickman

Générer des nombres aléatoires uniques

Traduction: Philippe Allouche

Cliquez pour générer une nouvelle liste de nombres

 INFOS 

Version Flash 4
Nivaeau Intermediate
Créé 9th June 2000

 TRADUCTIONS 

English

 FICHIERS 

ZIP

FLA

Quelqu'un sur Were Here demandait comment générer une série de nombres aléatoires sans répéter le même nombre. La solution évidente serait de vérifier tous les nombres créés à chaque fois, pour voir si le nouveau nombre n'est pas déjà présent. S'il existe déjà, on en génére un nouveau... jusqu'à en avoir suffisament. Cela fonctionne extrèmement mal -- le temps passé à vérifier ne serait-ce que peu de nombres est très pénalisant -- et comporte la possibilité de se perdre dans une boucle sans fin.

J'y ai réfléchis et j'ai trouvé cette méthode, qui n'est probablement pas innovante mais que je n'ai vu nulle part. Vous trouverez un fichier .fla zippé de l'exemple ci-dessus ici, et une version avec seulement le code aléatoire ici (c'est de cette version dont je parlerai).

Eclaire-moi, petit génie

Disons que vous voulez obtenir cinq nombres aléatoires entre 1 et 5. Evidemment si on veut générer seulement cinq nombres aléatoires ça ne marchera pas -- le même numéro apparaitra certainement plus d'une fois. A la place, nous créons une série de variables (un tableau, en fait) de toute les valeurs possibles -- dans ce cas 1, 2, 3, 4, 5. Ces variables (de var1 à var5) sont créées dans cette boucle :

Set Variable: "number" = 5
       Set Variable: "counter" = 1
       Loop While (counter <= number)
             Set Variable: "var"&counter = counter
             Set Variable: "counter" = counter + 1
End Loop

Ensuite on procède à la phase aléatoire.. D'abord on commence une boucle qui décrémente depuis le nombre total de nombres aléatoires que l'on désire (dans ce cas, cinq) jusqu'à deux. Ensuite on génére un nombre aléatoire appelé random_number entre 1 et notre nombre maxi (dans ce cas, cinq). On va chercher la valeur de la variable qui correspond à notre nouveau nombre aléatoire, et on la place dans une nouvelle variable "random"&counter. Ensuite on retire la variable 'usagée' du tableau en la remplaçant par la dernière valeur 'intacte'. Finalement on réduit le compteur de un, et on recommence la boucle. Une fois que la boucle est terminée, on assigne la valeur restante du tableau var à random1.

Set Variable: "counter" = number
Loop While (counter > 1)
             Set Variable: "random_number" = (Random (counter )) + 1
             Set Variable: "random"&counter = eval("var"&random_number)
             Set Variable: "var"&random_number = eval("var"&counter)
             Set Variable: "counter" = counter - 1
End Loop
Set Variable: "/random1:value" = var1

Redites moi ça ...?

Pour simplifier : voilà la liste des éventualités :

Boucle1: counter = 5

Boucle2: counter = 4

et ainsi de suite.

Ainsi chaque fois qu'on 'utilise' une des valeurs stockées dans le tableau (de var1 à var5), on la retire en la remplaçant par la valeur du dernier élément restant dans le tableau -- dans la première boucle ce serait var5, dans la deuxième ce serait var4, dans la troisième var3....vous saisissez le principe.

Je pense que vous devriez sortir plus souvent

Vous avez probablement raison.

Bon courage !

Stickman

All files and text copyright ©Stickman 1998 - 2003. For copyright and terms of use information, please read this page.