Comment générer des nombres aléatoires uniques ?
Nous savons que la fonction "rnd" permet de générer des nombres
aléatoires (cfr. question 11). Mais il arrive
fréquemment qu'un même nombre apparaisse plusieurs fois. Or il est parfois
intéressant que le nombre tiré ne soit jamais le même. Un exemple étant la
fonction "shuffle" que l'on trouve dans les lecteurs audio : un même
morceau n'est jamais joué deux fois.
Une solution à première vue évidente est d'employer un tableau de
booléens qui nous permettra de savoir si une valeur a déjà été tirée. Au
début, pas de problème. Mais plus on arrive vers la fin, plus la probabilité
de tomber sur une valeur déjà tirée augmente. On risque donc de devoir
patienter plusieurs minutes avant que la fonction rnd ne retourne une valeur
disponible.
La solution consiste en fait à utiliser un tableau contenant les valeurs
possibles et à chaque tirage de supprimer de ce tableau la valeur qui vient
d'être tirée et de réduire la taille du tableau d'une unité.
Prenons l'exemple d'une liste de 10 mp3. On crée un tableau à 10 entrées
contenant les 10 titres des morceaux mp3. Au premier tour on tire un nombre
entre 1 et 10. Par exemple, le morceau 5. On remplace le morceau 5 par le
dernier morceau, dans ce cas-ci le 10, et on décrémente le nombre de morceaux
qui devient donc 9. Au deuxième tour, on tire un nombre entre 1 et 9. Par
exemple, le 7. On remplace le morceau 7 par le 9. Le nombre de morceaux devient
8. Et ainsi de suite jusqu'à ce que tous les morceaux aient été tirés.
Traduit en code Visual Basic, cet exemple donne :
Private Sub Form_Load()
Dim Mp3List() As String ' Tableau contenant une liste de mp3
Dim Mp3Count As Long ' Nombre de mp3
Dim n As Long, i As Long ' Variables de travail
Mp3Count = 10
ReDim Mp3List(Mp3Count)
Mp3List(0) = "Bryan Adams - Everything I Do.mp3"
Mp3List(1) = "Eminem - Without Me.mp3"
Mp3List(2) = "Eros Ramazzotti - Quanto Amore
Sei.mp3"
Mp3List(3) = "Jean-Jacques Goldman - Au bout de mes
rêves.mp3"
Mp3List(4) = "Limp Bizkit - Take A Look Around.mp3"
Mp3List(5) = "The Cranberries - Animal
Instinct.mp3"
Mp3List(6) = "U2 - With or Without You.mp3"
Mp3List(7) = "Patrick Bruel - Place des grands
Hommes.mp3"
Mp3List(8) = "Fernand Raynaud - Le 22 à
Asnières.mp3"
Mp3List(9) = "Renaud - Manhattan-Kaboul (avec Axelle Red).mp3"
Randomize Timer ' Initialise le générateur de nombres
aléatoires
For n = 0 To Mp3Count - 1
i = Int((Mp3Count - n) * Rnd)
MsgBox Mp3List(i)
Mp3List(i) = Mp3List(Mp3Count - 1 -
n)
Next
End Sub |