Nombres aléatoires différents

oliverthekid

XLDnaute Nouveau
Bonjour,

Je souhaite donner une identification personelle a plus de 4000 éléments sur une base de donnée.
Il me faut donc pour cela un tirage aléatoire avec des nombres différents à chaque fois, idéalement entre 1000 et 9999.
J'ai vu beaucoup de solutions différentes pour des tirages entre 1 et 5 ou 1 et 16, mais pas entre 1000 et 9999!

Avez-vous une solution???

Merci d'avance!
 

Etienne2323

XLDnaute Impliqué
Re : Nombres aléatoires différents

Salut Oliverthekid,
voici une proposition. Vous n'avez qu'à changer les paramètres à votre guise.

VB:
Sub Test()
Dim Limite_Haut As Integer, Limite_Bas As Integer, NB_Aleatoire As Integer, i As Integer
Dim Nombre_Iterations As Integer

Randomize

Limite_Bas = 1000
Limite_Haut = 9999
Nombre_Iterations = 1000

For i = 1 To Nombre_Iterations
    NB_Aleatoire = Int((Haut - Bas + 1) * Rnd) + Bas
Next i

End Sub

Cordialement,

Étienne
 

tototiti2008

XLDnaute Barbatruc
Re : Nombres aléatoires différents

Bonjour oliverthekid,

et pourquoi aléatoire ?
pourquoi pas des identifiants qui vont de 1000 à 5000 (dans l'ordre) ?

Edit : Bonjour Etienne
Pas mal le code, mais il me semble que pour 1 Randomize, 256 valeurs aléatoires sont générées et qu'après il boucle dessus, donc tu risque fortement d'avoir des doublons

ReEdit : Il semblerait que les 256 soient dans les versions antérieures à 2003... Il ont amélioré le moteur aléatoire depuis Office 2003, mais le risque de doublons subsiste puisqu'il y a "arrondi" à un entier entre 1000 et 9999, et plusieurs valeurs aléatoires différentes peuvent produire le même entier
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Nombres aléatoires différents

Re,

Sur la base du code d'Etienne

Code:
Sub Test()
Dim Limite_Haut As Integer, Limite_Bas As Integer, NB_Aleatoire As Integer, i As Integer
Dim Nombre_Iterations As Integer, Dico, Tablo

Randomize
Set Dico = CreateObject("Scripting.Dictionary")

Limite_Bas = 1000
Limite_Haut = 9999
Nombre_Iterations = 1000
On Error Resume Next
Do
    NB_Aleatoire = Int((Limite_Haut - Limite_Bas + 1) * Rnd) + Limite_Bas
    Dico.Add NB_Aleatoire, NB_Aleatoire
Loop Until Dico.Count >= Nombre_Iterations
On Error GoTo 0
Tablo = Dico.Items
For i = 1 To Nombre_Iterations
Range("A" & i).Value = Tablo(i - 1)
Next i
End Sub
 

pierrejean

XLDnaute Barbatruc
Re : Nombres aléatoires différents

Bonjour a tous

en supposant les 4000 elements en colonne A a partir de A1 la macro ci-dessous affectera aleatoirement un N° entre 1000 et 9999 a chacun ecrit en colonne B

VB:
Sub alea()
Dim coll As Collection
Set coll = New Collection
While coll.Count < 4000
Randomize
x = Int((8999 * Rnd) + 1000)
On Error Resume Next
coll.Add Item:=x, Key:=CStr(x)
On Error GoTo 0
Wend
For n = 1 To 4000
Range("B" & n) = coll(n)
Next n
End Sub
 

Etienne2323

XLDnaute Impliqué
Re : Nombres aléatoires différents

Salut oliver, tototiti, le fil,
@ tototiti : C'est un ajout absolument brillant que d'avoir pensé à créer une liste sans doublon. Petite question, pourquoi passer, à la fin de votre code, par une boucle et un tablo ? Pourquoi ne pas vider le dico directement sur la plage ?

Par exemple :

VB:
Sub Test()
Dim Limite_Haut As Integer, Limite_Bas As Integer, NB_Aleatoire As Integer, i As Integer
Dim Nombre_Iterations As Integer, Dico

Application.ScreenUpdating = False

Randomize
Set Dico = CreateObject("Scripting.Dictionary")

Limite_Bas = 1000
Limite_Haut = 9999
Nombre_Iterations = 1000
On Error Resume Next
Do
    NB_Aleatoire = Int((Limite_Haut - Limite_Bas + 1) * Rnd) + Limite_Bas
    Dico.Add NB_Aleatoire, NB_Aleatoire
Loop Until Dico.Count >= Nombre_Iterations
On Error GoTo 0

Range("A1:A" & Nombre_Iterations).Value = Application.Transpose(Dico.items)

End Sub

Cordialement,

Étienne
 
Dernière édition:

tototiti2008

XLDnaute Barbatruc
Re : Nombres aléatoires différents

Re,
Bonjour PierreJean,

@PierreJean : c'est vrai que je ne pense pas à la solution Collection, il faudra que je m'y mette ;)
@Etienne :

Pourquoi ne pas vider le dico directement sur la plage ?

Euh, à cause du Transpose qui m'était sorti de l'esprit ?
Pour me la péter, je dirais que dans les anciennes version d'Excel transpose était limité à un certain nombre d'éléments et que j'évite de l'utiliser pour une meilleure compatibilité, mais en vrai la façon de l'écrire ne me revenais plus ;)
 

pierrejean

XLDnaute Barbatruc
Re : Nombres aléatoires différents

Re

Mais non tototiti

Le dictionary est très bien aussi
Une version a ma sauce

VB:
Sub alea()
Set dico = CreateObject("Scripting.Dictionary")
 Randomize
While dico.Count < 4000
  x = Int((8999 * Rnd) + 1000)
  dico(x) = 1
Wend
Range("B1").Resize(4000, 1) = Application.Transpose(dico.keys)
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 520
Messages
2 089 291
Membres
104 088
dernier inscrit
said4u