Extraire des nombres aléatoires sans doublons

Contenu du snippet

Bon, c'est un truc à quatre sous espagnols, mais l'ouverture d'un récent sujet me donne à penser qu'il convient de déposer ce petit code.

Il permet d'extraire à très vive allure, dans doublons, des nombres aléatoires d'une fourchette de nombres.

La technique utilisée est très différente des techniques habituelles. Je ne vais jamais rechercher si un nombre a déjà été utilisé. J'app)lique tout simplement une technique du "pousse-toi de là que je m'y mette", largement inspirée des habitudes bien connues d'un sapeur pompier (il s'appelait Camembert.... je ne plaisante pas...) auquel son chef avait fait remarquer qu'il y avait un trou dans la cour de la caserne. Notre brave ami Camembert a bouché ce trou en creusant un peu plus loin pour récolter de la terre et boucher le 1er trou. Mais voilà ! le 1er était bouché, mais il y en avait alors un autre, ainsi créé... qu'il a bouché en faisant donc un 3ème trou... et ainsi de suite .....à l'infini !!!!

Attitude idiote ? Certes !... Mais je m'en suis servi souvent (je vous raconterai un jour comment on peut l'utiliser pour avoir 1.000.000 d'idarts apparemment identiques dans une base de données et les retrouver tous à la vitesse grand V..., aussi rapidement que si l'on connaissait chacun des idarts concernés... dur dur et à la fois facile facile... merci à cet innocent de sapeur Camembert...)

Amitiés d'un vieux fou.

Source / Exemple :


Non !
Pas de zip pour si peu :

Une form, une listbox nommée List1 et un bouton de commande nommé Command1.

Code :

Private Sub Command1_Click()
  Const nbmini = 100 '-----ici la borne inférieure
  Const nbmaxi = 200 '-----ici la borne supérieure
  Const nbatirer = 101  'ici le nombre de numéros aléatoires à sortir entre les 2 bornes
  fourch = nbmaxi - nbmini
  If fourch + 1 < nbatirer Then
    MsgBox "Il est impossible de tirer " & nbatirer & "nombres dans la fourchette comprise entre " _
    & nbmini & " et " & nbmaxi & " qui ne comprend que " & fourch + 1 & " nombres, VOYONS !!!"
    Exit Sub
  End If
  Randomize
  Dim tabl(nbmaxi - nbmini + 1) As Integer, i As Integer, a As String, ou As Integer
  For i = 0 To nbmaxi - nbmini
    tabl(i) = nbmini + i
  Next
  List1.Clear
  For i = 0 To nbatirer - 1
    ou = Int(((fourch - i) * Rnd))
    a = a & vbCrLf & tabl(ou)
    List1.AddItem tabl(ou)
    tabl(ou) = tabl(fourch - i)
  Next
  Erase tabl
End Sub

Voilà tout ! Vous aurez l'occasion de mesurer la vitesse de traitement !

Je signe ici mais aurait préféré y voir celle de notre ami sapeurpompier, décédé il y a des décennies....

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.