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

Rnd, Rnd() et Randomize

5 réponses
Avatar
garnote
Bonjour, Bonjour et Merci, Merci,

Cette macro génère n nombres entiers différents
choisis au hasard entre a et b (bornes incluses).
bi : nom de la cellule contenant a
bs : nom de la cellule contenant b
nombre : nom de la cellule contenant n
Dans cette macro, j'utilse Rnd().
Je pourrais changer Rnd pour Rnd() ou ajouter
Randomize juste avant v = Int((b - a + 1) * Rnd() + a)
Quatre scénarios :
1) Rnd sans Randomize
2) Rnd et Randomize
3) Rnd() sans Randomize
4) Rnd() et Randomize

Question :
Qu'est-ce qui distingue chacun de ces scénarios
quant au résultat obtenu ?

Sub HasardSansDoublons()
a = [bi]
b = [bs]
n = [nombre]
If n > b - a + 1 Then
MsgBox Prompt:="Il faut que n soit plus petit que " & b - a + 2 & ".", Title:=" Impossible !"
Exit Sub
End If
[a3:a65536].ClearContents
Set dico = CreateObject("Scripting.Dictionary")
Do Until i = n
v = Int((b - a + 1) * Rnd() + a)
If Not dico.Exists(v) Then
dico.Add v, v
i = i + 1
End If
Loop
[a4].Resize(i) = Application.Transpose(dico.items)
End Sub

Serge

5 réponses

Avatar
MichDenis
Une tite adresse et un peu de lecture en anglais

Tu lis la section : "Random Number and Randomize Statement"

http://www.anthony-vba.kefra.com/vba/excelvba-simulation-102.htm




"garnote" a écrit dans le message de groupe de discussion :

Bonjour, Bonjour et Merci, Merci,

Cette macro génère n nombres entiers différents
choisis au hasard entre a et b (bornes incluses).
bi : nom de la cellule contenant a
bs : nom de la cellule contenant b
nombre : nom de la cellule contenant n
Dans cette macro, j'utilse Rnd().
Je pourrais changer Rnd pour Rnd() ou ajouter
Randomize juste avant v = Int((b - a + 1) * Rnd() + a)
Quatre scénarios :
1) Rnd sans Randomize
2) Rnd et Randomize
3) Rnd() sans Randomize
4) Rnd() et Randomize

Question :
Qu'est-ce qui distingue chacun de ces scénarios
quant au résultat obtenu ?

Sub HasardSansDoublons()
a = [bi]
b = [bs]
n = [nombre]
If n > b - a + 1 Then
MsgBox Prompt:="Il faut que n soit plus petit que " & b - a + 2 & ".",
Title:=" Impossible !"
Exit Sub
End If
[a3:a65536].ClearContents
Set dico = CreateObject("Scripting.Dictionary")
Do Until i = n
v = Int((b - a + 1) * Rnd() + a)
If Not dico.Exists(v) Then
dico.Add v, v
i = i + 1
End If
Loop
[a4].Resize(i) = Application.Transpose(dico.items)
End Sub

Serge
Avatar
MichDenis
Maintenant que tu as lu le cours 101 sur Rnd et randomize avec petit exemple ;-)

Tu dois te reporter à l'aide d'excel :

Rnd(number)
La valeur de l'argument "number" définit le mode de génération adopté par Rnd :

Quelle que soit la valeur initiale indiquée, la même série de nombres aléatoires est
générée à chaque appel de la fonction Rnd, car cette dernière réutilise le nombre
aléatoire précédent comme valeur initiale pour le calcul du nombre suivant.

En conséquence :
Randomize utilise l'argument "number" pour initialiser le générateur de nombres aléatoires
de la fonction Rnd en lui donnant une nouvelle valeur initiale. Si l'argument number est
omis, la valeur renvoyée par l'horloge système sert de valeur initiale.

L'argument number pourrait bien être défini par une fonction de ton application !

Le choix de la méthode dépend de ce que l'utilisateur a besoin pour mélanger les cartes
;-)







"MichDenis" a écrit dans le message de groupe de discussion :

Une tite adresse et un peu de lecture en anglais

Tu lis la section : "Random Number and Randomize Statement"

http://www.anthony-vba.kefra.com/vba/excelvba-simulation-102.htm




"garnote" a écrit dans le message de groupe de discussion :

Bonjour, Bonjour et Merci, Merci,

Cette macro génère n nombres entiers différents
choisis au hasard entre a et b (bornes incluses).
bi : nom de la cellule contenant a
bs : nom de la cellule contenant b
nombre : nom de la cellule contenant n
Dans cette macro, j'utilse Rnd().
Je pourrais changer Rnd pour Rnd() ou ajouter
Randomize juste avant v = Int((b - a + 1) * Rnd() + a)
Quatre scénarios :
1) Rnd sans Randomize
2) Rnd et Randomize
3) Rnd() sans Randomize
4) Rnd() et Randomize

Question :
Qu'est-ce qui distingue chacun de ces scénarios
quant au résultat obtenu ?

Sub HasardSansDoublons()
a = [bi]
b = [bs]
n = [nombre]
If n > b - a + 1 Then
MsgBox Prompt:="Il faut que n soit plus petit que " & b - a + 2 & ".",
Title:=" Impossible !"
Exit Sub
End If
[a3:a65536].ClearContents
Set dico = CreateObject("Scripting.Dictionary")
Do Until i = n
v = Int((b - a + 1) * Rnd() + a)
If Not dico.Exists(v) Then
dico.Add v, v
i = i + 1
End If
Loop
[a4].Resize(i) = Application.Transpose(dico.items)
End Sub

Serge
Avatar
garnote
Alors Ô maître ceinture noire 9 ième dan Excel,
ai-je bien compris ton enseignement ? ;-)

http://www.cijoint.fr/cjlink.php?file=cj200903/cijUMI3APE.xls


Serge


"MichDenis" a écrit dans le message de news:
Maintenant que tu as lu le cours 101 sur Rnd et randomize avec petit exemple ;-)

Tu dois te reporter à l'aide d'excel :

Rnd(number)
La valeur de l'argument "number" définit le mode de génération adopté par Rnd :

Quelle que soit la valeur initiale indiquée, la même série de nombres aléatoires est
générée à chaque appel de la fonction Rnd, car cette dernière réutilise le nombre
aléatoire précédent comme valeur initiale pour le calcul du nombre suivant.

En conséquence :
Randomize utilise l'argument "number" pour initialiser le générateur de nombres aléatoires
de la fonction Rnd en lui donnant une nouvelle valeur initiale. Si l'argument number est
omis, la valeur renvoyée par l'horloge système sert de valeur initiale.

L'argument number pourrait bien être défini par une fonction de ton application !

Le choix de la méthode dépend de ce que l'utilisateur a besoin pour mélanger les cartes
;-)







"MichDenis" a écrit dans le message de groupe de discussion :

Une tite adresse et un peu de lecture en anglais

Tu lis la section : "Random Number and Randomize Statement"

http://www.anthony-vba.kefra.com/vba/excelvba-simulation-102.htm




"garnote" a écrit dans le message de groupe de discussion :

Bonjour, Bonjour et Merci, Merci,

Cette macro génère n nombres entiers différents
choisis au hasard entre a et b (bornes incluses).
bi : nom de la cellule contenant a
bs : nom de la cellule contenant b
nombre : nom de la cellule contenant n
Dans cette macro, j'utilse Rnd().
Je pourrais changer Rnd pour Rnd() ou ajouter
Randomize juste avant v = Int((b - a + 1) * Rnd() + a)
Quatre scénarios :
1) Rnd sans Randomize
2) Rnd et Randomize
3) Rnd() sans Randomize
4) Rnd() et Randomize

Question :
Qu'est-ce qui distingue chacun de ces scénarios
quant au résultat obtenu ?

Sub HasardSansDoublons()
a = [bi]
b = [bs]
n = [nombre]
If n > b - a + 1 Then
MsgBox Prompt:="Il faut que n soit plus petit que " & b - a + 2 & ".",
Title:=" Impossible !"
Exit Sub
End If
[a3:a65536].ClearContents
Set dico = CreateObject("Scripting.Dictionary")
Do Until i = n
v = Int((b - a + 1) * Rnd() + a)
If Not dico.Exists(v) Then
dico.Add v, v
i = i + 1
End If
Loop
[a4].Resize(i) = Application.Transpose(dico.items)
End Sub

Serge




Avatar
michdenis
À savoir si on doit utiliser Rnd, Rnd(Number) ou Randomize,
cela dépend de l'utilité et de la nécessité de définir la notion
de hasard dans la suite des numéros des tirages obtenus.

Si tu dirigeais une maison de loterie, il y aurait de forte chance
que quelqu'un découvre rapidement l'algorithme utilisée qu'utilise Rnd.
En conséquence, comme le résultat serait prévisible, on ne peut
plus parler de hasard ... et "tous" pourrait prédire le résultat du
tirage...La question, dans quelle mesure avons nous besoin
d'utiliser une série émanant de la "pure chance (hasard)" dans la
problématique que l'on tente de résoudre ? Ce à quoi la notion
de randomize tente de répondre.
Avatar
Modeste
Bonsour® michdenis avec ferveur ;o))) vous nous disiez :

À savoir si on doit utiliser Rnd, Rnd(Number) ou Randomize,
cela dépend de l'utilité et de la nécessité de définir la notion
de hasard dans la suite des numéros des tirages obtenus.

Si tu dirigeais une maison de loterie, il y aurait de forte chance
que quelqu'un découvre rapidement l'algorithme utilisée qu'utilise
Rnd. En conséquence, comme le résultat serait prévisible, on ne peut
plus parler de hasard ... et "tous" pourrait prédire le résultat du
tirage...La question, dans quelle mesure avons nous besoin
d'utiliser une série émanant de la "pure chance (hasard)" dans la
problématique que l'on tente de résoudre ? Ce à quoi la notion
de randomize tente de répondre.



;o))) de façon mathématique ou programme informatique, le hasard pur n'existe pas

j'ajouterai pour etre plus explicite
selon l'aide en ligne,
la fonction Rnd (sans argument) adopte le même nombre comme valeur initiale la première fois qu'elle est appelée.
Lors des appels ultérieurs, elle réutilise le dernier nombre généré comme valeur initiale.
exemple :

soit la Proc
'*****************
Sub testalea()
For i = 1 To 30
Cells(i, 1) = Rnd()
Next
End Sub
'************
lancer UNE fois la proc
selectionner les valeurs obtenues,
faire un copier collage spécial valeurs en colonne 4
effacer la colonne A
fermer le classeur

réouvrir le classeur
re-exécuter la proc
on constate l'affichage de valeurs identiques au tirage précédent

si l'on lance x fois la proc
que l'on ferme, puis réouvre le classeur
il suffira de lancer x fois la proc pour retrouver les valeurs précédentes

l'utilisation de randomize permet de s'affranchir de cette répétitivité...

mais on veut parfois obtenir des tirages aléatoires consécutifs identiques
il faut alors
appeler la fonction Rnd() avec un parametre négatif
ET utiliser le parametre de Randomize

'***************
Sub testalea2()
xxx = Rnd(-1)
For j = 1 To 6
Randomize (j)
For i = 1 To 20
Cells(i, j) = Rnd()
Next
Next
End Sub
'****************