TEST DE LA FONCTION ALÉATOIRE RND DE VISUAL BASIC

amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 - 8 mars 2006 à 13:15
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017 - 23 août 2008 à 23:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/36436-test-de-la-fonction-aleatoire-rnd-de-visual-basic

lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
23 août 2008 à 23:26
Bonjour US_30

Merci pour les appréciations.
Le but de cette source n'était pas initialemment de montrer les limites de RND.
C'est en utilisant les résultats donnés par le programme
qu'à ma surprise, le pseudo aléatoire RND à montré ses limites pour simuler la sortie de 6 numéros au Loto.
Bien sûr,comme l'a montré GOBILLOT, plus haut, il n'y a rien d'étonnant à celà.
Pour la programmation , en effet, je n'ai pas cherché en priorité à optimiser le Code.
A plus
JP
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
17 août 2008 à 12:20
Morale de l'histoire : Bien ou mal simulé, on voit qu'avec 1 chance sur 13983816 pour vraiment gagner (6 n°), c'est de la folie pure de jouer au loto ! ...

Une remarque sur la programmation : elle est largement optimisable... Mais l'intérêt de montrer la limite de RND est intéressant.

Amicalement,
Us.
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
31 oct. 2006 à 20:36
Bonjour Gobillot.

J'ai testé le Simulateur de tirages du Loto
en remplaçant la fonction Rnd de Visual Basic
par la tienne que tu appelles Wrnd().
Maintenant on constate par exemple que pour 1.400.000.000
tirages de 6 n°,l'erreur relative entre la théorie et la simulation n'est que de 10 à 15 pour cent quelles que soient
les combinaisons à 6 n° choisies.
Bien sûr en augmentant le nombre de tirages de 6 n°
cette erreur relative doit diminuer encore.
Je vais essayer avec 14.000.000.000 tirages pour le constater.
Merci encore pour ta fonction.
A plus
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
28 oct. 2006 à 06:44
Bonjour Gobillot.

Merci pour ta fonction Wrnd() de période 2^48.
C'est avec plaisir que je vais la tester.
Ca va être bien de constater que la sortie des
combinaisons à six numéros colle enfin plus à la théorie.
A bientôt avec les résultats du test.
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
26 oct. 2006 à 23:37
et aussi de remplacer la fonction Rnd() par une fonction perso
par exemple celle-ci de fréquence 2^48 (donc plus de possibilités)
il suffit de remplacer les Rnd() par WRnd()

Dim WW0 As Currency
Dim WWA As Currency
Dim WWC As Currency
Dim WWM As Currency

Private Sub Form_Load()
WW0 = 28002971
WWA = 32353
WWC = 6534
WWM = 28147497671.0656
End Sub

Private Function WRnd() As Double
Dim x As Currency
x = WWA * WW0 + WWC
WWC = Int(x / WWM)
WW0 = x - WWC * WWM
WRnd = WW0 / WWM
End Function
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 oct. 2006 à 08:38
c'était de toutes facon qu'un exemple qui montre que le while n'était pas forcément de mise ici ^^ (sans jeu de mot)
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
18 oct. 2006 à 22:09
Bonjour Renfield.

Merci pour cette solution qui me montre l'existence de l'objet
"Collection" et son fonctionnement.
J'ai utilisé une autre façon d'éviter les rnd multiples.
Je me servirai de ta solution pour une prochaine source.
Encore Merci
A plus.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
18 oct. 2006 à 07:33
une solution pour régler le soucis des rnd multiples, est d'utiliser une liste des valeurs...(basiquement, une collection)
la valeur trouvée par le Rnd ne serait pas le chiffre, mais l'indice de "la boule" dans cette collection.
une foid ainsi piochée, on enlève la boule de la collection.
le prochain rnd se fera sur un élément en moins (1-48)
si on retombais sur un des nombres déjà tombés, cela pointerait sur une boule différente...
donc aucun soucis de ce coté là :



Dim oCol as Collection
For u = 1 To b
If 0 = u Mod 1000 Then
DoEvents
End If
Set oCol = New Collection
For i = 1 To 49
oCol.Add i
Next i

DoEvents
i = Int(1 + Rnd * oCol.Count)
S = oCol(i)
oCol.Remove (i)

i = Int(1 + Rnd * oCol.Count)
V = oCol(i)
oCol.Remove (i)

i = Int(1 + Rnd * oCol.Count)
W = oCol(i)
oCol.Remove (i)

i = Int(1 + Rnd * oCol.Count)
X = oCol(i)
oCol.Remove (i)

i = Int(1 + Rnd * oCol.Count)
Y = oCol(i)
oCol.Remove (i)

i = Int(1 + Rnd * oCol.Count)
Z = oCol(i)
oCol.Remove (i)

...
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
18 oct. 2006 à 00:29
Bonjour.
Je pense qu'il serait plus dans l'esprit de ce site, de justifier les notes bonnes ou mauvaises par un minimum
d'explications sur ce qui a plu ou déplu dans une source.
Sans cela on ne peut pas avancer.
Des commentaires même simples seraient intéressants
Merci.
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
10 mars 2006 à 20:06
Salut Amezghal.
Si tu as trouvé des erreurs dans le code,peux-tu me les communiquer afin que je les corrige.
Merci.
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
10 mars 2006 à 19:56
Pour CCJ je répondrais que s'il est possible à l'aide d'un bon générateur de nombres pseudo aléatoires,de simuler avec précision
le tirage du Loto,il est par contre impossible de prédire la combinaison gagnante.
La seule certitude du Hasard est la Loi Des Grands Nombres.
Au sujet de ta proposition de tenir compte de la position initiale des boules,le problème est si complexe qu'il n'est certainement pas pour moi.
A+ CCJ
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
9 mars 2006 à 21:55
C'est exactement les fréquences que j'ai pû constater pour
ces deux séquences.Pour celle qui sort un peu plus de cinq fois
plus que la normale,j'ai été surpris.
Tes explications sont intéressantes et convaincantes.
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
9 mars 2006 à 15:15
il s'agit ici de tester la fonction Rnd() et non pas de trouver les résultats du loto.

tous les nombres devant sortir avec la même chance, chaque séquence de 6 nombres devraient aussi sortir avec la même chance. vrai ou pas ?
le résultat est troublant...!
y a t-il des séquences privilègiées ?

réponse: OUI
sur 16777216 possibilités, certaines séquences existent, d'autres pas.
la séquence 5-15-25-27-35-45 (l'ordre n'a pas d'importance) sur 13983816 tirages, devrait d'après la théorie, sortir une fois,
or elle sort 5 fois ????
en réalité on fait plus de tirages puisqu'on élimine les nombres déjà sortis, je trouve 88522009 (chaque Rnd est compté) pour 6 chiffres, soit 14753668 combinaisons possibles, déjà c'est plus que 13983816, donc un peu plus d'une chance.

mais on oublie que la séquence a été parcourue 88522009/16777216 = un peu plus de 5 fois,et forcément la même séquence qui existe une fois, revient 5 fois d'où le résultat.
par contre la séquence 1-2-3-4-5-6 n'existe pas d'où le résultat = 0.
si on multiplie le nombre de tirages, on retrouve bien des multiples:
139838160 tirages: (10 fois d'après la théorie)
- 53 fois pour la première séquence
(885217409/16777216) * 1 fois
- 0 fois pour la deuxième
(885217108/16777216) * 0 fois

voilà l'explication, vu la pauvreté de la période, toutes les possibilités ne peuvent pas être représentées
CCJ Messages postés 565 Date d'inscription mercredi 19 mai 2004 Statut Membre Dernière intervention 30 avril 2008 1
9 mars 2006 à 12:21
juste une remarque : on obtiendra jamai les bon tirages du loto avec des rnd de vb car les loi de la phisique ki entrent en compte ne sont pas les meme(juste comme ca^^)
Donc plutot ke de faire une source qui sert a rien( c vrai elle sert pa a granche chose en fait) , essay de simuler un tirage loto en fonction de la posistion initiale des boule ;)
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
9 mars 2006 à 07:03
En réponse à Gobillot : Je suis tout à fait d'accord avec la justesse de tes remarques.
Le problème reste quand même que du fait de la faible période
de RND,l'équiprobabilité des combinaisons à 6 n° n'est pas bonne
par exemple entre les combinaisons ( 5-15-25-35-45-27 ) et
( 1-2-3-4-5-6 ).Les écarts constatés sont vraiment importants.
Par contre si l'on teste beaucoup de combinaisons différentes,
la fréquence moyenne pour une sortie à 6 n° se rapproche mieux
de la fréquence théorique.
A plus.
JP.
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
9 mars 2006 à 03:54
Randomize n'est pas nécessaire dans le cas ici présent puisqu'il faut tester tous les cas.

pas la peine non plus de faire un si grand nombre de tirages puisque la période n'est que de 2^24

donc sur 16777216 tirages maximum on doit trouver en théorie:
16777216 / 49 = 342392,1633

ce qui se vérifie après test:
on trouve 2 groupes:
342393 pour les nombres: 1,7,13,19,25,31,37,43
342392 pour tous les autres

donc pas très grande différence, on peut même dire que la répartition est bien équilibrée.

pour tous les tirages supplémentaires, la répartition sera un multiple de ces nombres aux bornes près, c'est à dire que si le nombre de tirage est un multiple de 2^24, les résultats seront exactement un multiple de 342392 ou 342393, Randomize ou pas.
amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 5
8 mars 2006 à 21:59
y a des erreurs dans votre code pourquoi quelqu'uns donne des mauvaise notes
lexsty Messages postés 169 Date d'inscription samedi 10 décembre 2005 Statut Membre Dernière intervention 18 juin 2017
8 mars 2006 à 19:30
Bonjour AMEZGHAL.
RANDOMIZE a toujours été présent et devant RND,bien sûr.
En cherchant, on le trouve après : " ' INITIALISATIONS ".
Merci quand même
Salut.
amezghal Messages postés 385 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 21 août 2015 5
8 mars 2006 à 13:15
n'oublie d'ajouter la commande RANDOMIZE avant RND
Rejoignez-nous