Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 82

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

Date de publication : 16 septembre 2002
Dernière modification : 16 septembre 2002
Rubriques : Math
Mots-clés : math, nombres, aléatoires, uniques, random, rnd, randomize