Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tirage aléatoire

10 réponses
Avatar
JulieH
Bonjour à toutes et tous,

Je souhaite réaliser des tirages aléatoires avec Excel, j'ai consulté
les archives des forums et j'ai trouvé de nombreuses idées mais je n'ai
rien réussi à mettre en oeuvre.

De A1 à A1000, j'ai des valeurs de 1 à 1000. Je souhaite obtenir en
B1:B30 une liste de valeurs toutes différentes et choisies de manière
aléatoire.

Cela peut-être avec macro ou avec formule.

Merci par avance pour vos réponses.

Julie

10 réponses

Avatar
JPMonnier
Bonjour,
En B1, tu entres cette formule
=ALEA.ENTRE.BORNES(1;1000)
tu tire ta formule jusqu'à B30
En faisant F9, tes chiffres vont changer
Dans le cas ou tes chiffres sont de 1 à 1000, inutile de les rentrer de A1 à
A 1000
--
Cordialement


"JulieH" a écrit dans le message de
news:
Bonjour à toutes et tous,

Je souhaite réaliser des tirages aléatoires avec Excel, j'ai consulté les
archives des forums et j'ai trouvé de nombreuses idées mais je n'ai rien
réussi à mettre en oeuvre.

De A1 à A1000, j'ai des valeurs de 1 à 1000. Je souhaite obtenir en B1:B30
une liste de valeurs toutes différentes et choisies de manière aléatoire.

Cela peut-être avec macro ou avec formule.

Merci par avance pour vos réponses.

Julie


Avatar
Modeste
Bonsour® JPMonnier avec ferveur ;o))) vous nous disiez :

Bonjour,
En B1, tu entres cette formule
=ALEA.ENTRE.BORNES(1;1000)
tu tire ta formule jusqu'à B30
En faisant F9, tes chiffres vont changer
Dans le cas ou tes chiffres sont de 1 à 1000, inutile de les rentrer
de A1 à A 1000



cela n'évite pas les doublons !!!

autre solution sans macro :
en colonne A :
tirer 1000 fois vers le bas la formule
=Alea()

en colonne B
tirer 30 fois vers le bas la formule
=Rang(A1;$A$1:$A$1000)
Avatar
Jacky
Bonjour,

Une solution sans doublon en vba
'-----------------
Sub tirage()
Application.ScreenUpdating = False
Dim i As Integer
Randomize
For i = 1 To 30
Do
Cells(i, 2) = Int((1000 * Rnd) + 1)
Loop Until Application.CountIf([b1:b30], Cells(i, 2)) = 1
Next i
End Sub
'------------------
Voir ici
http://www.cijoint.fr/cjlink.php?file=cj200909/cijgscfUIs.xls

--
Salutations
JJ


"JulieH" a écrit dans le message de news:

Bonjour à toutes et tous,

Je souhaite réaliser des tirages aléatoires avec Excel, j'ai consulté les
archives des forums et j'ai trouvé de nombreuses idées mais je n'ai rien
réussi à mettre en oeuvre.

De A1 à A1000, j'ai des valeurs de 1 à 1000. Je souhaite obtenir en B1:B30
une liste de valeurs toutes différentes et choisies de manière aléatoire.

Cela peut-être avec macro ou avec formule.

Merci par avance pour vos réponses.

Julie


Avatar
JulieH
Bonjour et merci à tous les 2 pour vos réponses,

Pour la première solution, je confirme qu'il peut y avoir des doublons.
Pour la seconde, cela me semble fonctionner et je n'ai jamais vu de
doublons mais la technique me paraît un peu "sauvage" car dès que l'on
modifie une cellule quelconque de la feuille, la liste change. Comment
expliquer cela ?

Si quelqu'un a également une solution qui fonctionne avec Macro, je
suis intéressée.

Julie

Modeste a écrit :
Bonsour® JPMonnier avec ferveur ;o))) vous nous disiez :

Bonjour,
En B1, tu entres cette formule
=ALEA.ENTRE.BORNES(1;1000)
tu tire ta formule jusqu'à B30
En faisant F9, tes chiffres vont changer
Dans le cas ou tes chiffres sont de 1 à 1000, inutile de les rentrer
de A1 à A 1000



cela n'évite pas les doublons !!!

autre solution sans macro :
en colonne A :
tirer 1000 fois vers le bas la formule
=Alea()

en colonne B
tirer 30 fois vers le bas la formule
=Rang(A1;$A$1:$A$1000)


Avatar
Modeste
Bonsour® Jacky avec ferveur ;o))) vous nous disiez :

Une solution sans doublon en vba
'-----------------
Sub tirage()
Application.ScreenUpdating = False
Dim i As Integer
Randomize
For i = 1 To 30
Do
Cells(i, 2) = Int((1000 * Rnd) + 1)
Loop Until Application.CountIf([b1:b30], Cells(i, 2)) = 1
Next i
End Sub
'------------------



à noter que cette methode devient gourmande en nbr de boucles lorsque le nombre de tirages est proche de la population totale
pour cette même raison il conviendrait également de purger préalablement la plage [B1:B30]

Sub tirage()
Dim i As Integer, x As Double
Dim tirages As Integer, population As Integer
Randomize
tirages = 30
population = 1000
'-----;o)))-- oter les mises en commentaire des lignes ci-dessous pour verifier
'[B1:B30].ClearContents
'population=tirage
x = 0
For i = 1 To tirages ' ---population >> tirages
Do
x = x + 1
Cells(i, 2) = Int((population * Rnd) + 1)
Cells(i, 3) = x
Loop Until Application.CountIf([B1:B30], Cells(i, 2)) = 1
Next i
DoEvents
MsgBox "Nbr total de boucles : " & x

End Sub
Avatar
FS
Bonjour,

> Si quelqu'un a également une solution qui fonctionne avec Macro, je
> suis intéressée.

Avec une autre approche que la proposition de Jacky, 2 procédures tirées
de mes archives :

'======================== Sub Loto()
'd'après auteur inconnu
Dim i, choice, balls(1000)
For i = 1 To 1000
balls(i) = i
Next
Randomize Timer
For i = 1 To 30
choice = 1 + Int((Rnd * (999 - i)))
Range("B1").Offset(i - 1, 0).Value = balls(choice)
balls(choice) = balls(1000 - i)
Next
End Sub

Sub Aléatoire()
'd'après L Longre

Dim Arr(1 To 1000, 1 To 1) As Integer
Dim i As Integer, J As Integer, K As Integer
For i = 1 To 1000
Arr(i, 1) = i
Next i
Randomize Timer
For i = 1 To 30
J = Int(Rnd * (1001 - i)) + 1
K = Arr(i, 1)
Arr(i, 1) = Arr(J, 1)
Arr(J, 1) = K
Next i
[B1:B30] = Arr
End Sub
'========================
FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

JulieH a écrit :
Bonjour et merci à tous les 2 pour vos réponses,

Pour la première solution, je confirme qu'il peut y avoir des doublons.
Pour la seconde, cela me semble fonctionner et je n'ai jamais vu de
doublons mais la technique me paraît un peu "sauvage" car dès que l'on
modifie une cellule quelconque de la feuille, la liste change. Comment
expliquer cela ?

Si quelqu'un a également une solution qui fonctionne avec Macro, je
suis intéressée.

Julie

Modeste a écrit :
Bonsour® JPMonnier avec ferveur ;o))) vous nous disiez :
Bonjour,
En B1, tu entres cette formule
=ALEA.ENTRE.BORNES(1;1000)
tu tire ta formule jusqu'à B30
En faisant F9, tes chiffres vont changer
Dans le cas ou tes chiffres sont de 1 à 1000, inutile de les rentrer
de A1 à A 1000



cela n'évite pas les doublons !!!

autre solution sans macro :
en colonne A :
tirer 1000 fois vers le bas la formule =Alea()

en colonne B
tirer 30 fois vers le bas la formule =Rang(A1;$A$1:$A$1000)




Avatar
Modeste
Bonsour® JulieH avec ferveur ;o))) vous nous disiez :

Pour la première solution, je confirme qu'il peut y avoir des
doublons. Pour la seconde, cela me semble fonctionner et je n'ai
jamais vu de doublons mais la technique me paraît un peu "sauvage"
car dès que l'on modifie une cellule quelconque de la feuille, la
liste change. Comment expliquer cela ?



;o))) cela est vrai ("sauvage") pour les deux methodes ...
l'utilisation d'une fonction alea est tributaire du mode de recalcul
il s'agit d'un option pouvant etre fixée via le menu Outil > options >onglet calcul
il suffit de choisir calcul sur Ordre

Si quelqu'un a également une solution qui fonctionne avec Macro, je
suis intéressée.



si' l'on souhaite cependant garder le recalcul automatique ,
il faut necessairement utiliser une macro recopiant en valeur la plage B1:B30 vers une autre destination

Sub generation()
Application.Calculation=xlmanual
Range("B1:B30").Copy
Range("C1").PasteSpecial Paste:=xlPasteValues
Application.Calculation=xlautomatique
End Sub
Avatar
JulieH
Bonjour et merci également pour t'intéresser à ma question,

Je vais tester cela.

Bonne journée

Julie

Jacky a écrit :
Bonjour,

Une solution sans doublon en vba
'-----------------
Sub tirage()
Application.ScreenUpdating = False
Dim i As Integer
Randomize
For i = 1 To 30
Do
Cells(i, 2) = Int((1000 * Rnd) + 1)
Loop Until Application.CountIf([b1:b30], Cells(i, 2)) = 1
Next i
End Sub
'------------------
Voir ici
http://www.cijoint.fr/cjlink.php?file=cj200909/cijgscfUIs.xls



Avatar
JulieH
Merci beaucoup pour toutes ces précisions.

Julie

Modeste a écrit :
Bonsour® Jacky avec ferveur ;o))) vous nous disiez :

Une solution sans doublon en vba
'-----------------
Sub tirage()
Application.ScreenUpdating = False
Dim i As Integer
Randomize
For i = 1 To 30
Do
Cells(i, 2) = Int((1000 * Rnd) + 1)
Loop Until Application.CountIf([b1:b30], Cells(i, 2)) = 1
Next i
End Sub
'------------------



à noter que cette methode devient gourmande en nbr de boucles lorsque le nombre de tirages est proche de la population totale
pour cette même raison il conviendrait également de purger préalablement la plage [B1:B30]

Sub tirage()
Dim i As Integer, x As Double
Dim tirages As Integer, population As Integer
Randomize
tirages = 30
population = 1000
'-----;o)))-- oter les mises en commentaire des lignes ci-dessous pour verifier
'[B1:B30].ClearContents
'population=tirage
x = 0
For i = 1 To tirages ' ---population >> tirages
Do
x = x + 1
Cells(i, 2) = Int((population * Rnd) + 1)
Cells(i, 3) = x
Loop Until Application.CountIf([B1:B30], Cells(i, 2)) = 1
Next i
DoEvents
MsgBox "Nbr total de boucles : " & x

End Sub




Avatar
Jacky
Bonjour Modeste

...il conviendrait également de purger préalablement la plage [B1:B30]


'---------
Loop Until Application.CountIf(Range("b1:b" & i), Cells(i, 2)) = 1
'---------
C'est cela que tu voulais dire ??
Bien qu'en modifiant ma boucle comme ceci
La macro reste beaucoup moins rapide que celles que Fredéric a sorti de ses
archives.
Je remballe...snifff
;o))

Ps: Pourquoi "DoEvents" ???
--
Salutations
JJ


"Modeste" a écrit dans le message de news:

Bonsour® Jacky avec ferveur ;o))) vous nous disiez :

Une solution sans doublon en vba
'-----------------
Sub tirage()
Application.ScreenUpdating = False
Dim i As Integer
Randomize
For i = 1 To 30
Do
Cells(i, 2) = Int((1000 * Rnd) + 1)
Loop Until Application.CountIf([b1:b30], Cells(i, 2)) = 1
Next i
End Sub
'------------------



à noter que cette methode devient gourmande en nbr de boucles lorsque le
nombre de tirages est proche de la population totale
pour cette même raison il conviendrait également de purger préalablement la
plage [B1:B30]

Sub tirage()
Dim i As Integer, x As Double
Dim tirages As Integer, population As Integer
Randomize
tirages = 30
population = 1000
'-----;o)))-- oter les mises en commentaire des lignes ci-dessous pour
verifier
'[B1:B30].ClearContents
'population=tirage
x = 0
For i = 1 To tirages ' ---population >> tirages
Do
x = x + 1
Cells(i, 2) = Int((population * Rnd) + 1)
Cells(i, 3) = x
Loop Until Application.CountIf([B1:B30], Cells(i, 2)) = 1
Next i
DoEvents
MsgBox "Nbr total de boucles : " & x

End Sub