Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TEST DE LA FONCTION ALÉATOIRE RND DE VISUAL BASIC


Information sur la source

Catégorie :Maths Classé sous : simulation, test, rnd, visual basic, loto Niveau : Initié Date de création : 07/03/2006 Date de mise à jour : 23/07/2008 02:47:08 Vu / téléchargé: 10 109 / 904

Note :
4,33 / 10 - par 6 personnes
4,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Ce Simulateur de tirages du Loto montre que la fonction RND de Visual Basic permet de tirer des nombres
pseudo aléatoires de façon satisfaisante pour des combinaisons jusqu'à cinq numéros.Mais pour des combinaisons
de six numéros, la Pratique ne colle plus à la Théorie.On peut même voir que des combinaisons différentes,de six
numéros ne sont pas équiprobables.Ce qui bien sûr est loin d'être normal.Par exemple:la combinaison 5-15-25-35-45-27
sort bien trop souvent alors que c'est l'inverse pour la combinaison 1-2-3-4-5-6.Et ceci, même si on demande un très
grand nombre de tirages .(Par exemple 6500000000 tirages).
Pour beaucoup mieux simuler le Loto, un Générateur de nombres pseudo aléatoires existe:il s'agit du MERSENNE TWISTER
qui est très performant.Sa période est un nombre astronomique : (2^19937)-1 (Mais pour l'instant il n'est pas dans la source).
Pour se servir du programme,il faut entrer le nombre de tirages voulu et saisir une combinaison de six numéros à tester.
On lance ensuite par la commande SIMULER.Après un test de rapidité du PC, l'heure de la fin de la simulation s'affichera.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

08 mars 2006 00:25:55 :
Rajout du Zip et de la Capture d'écran suite à problême d'Upload (zip trop gros : PDF dedans ,remplacés par JPG )
07 juin 2008 08:24:02 :
Modification du titre de la source.
23 juillet 2008 02:47:09 :
Modification du titre

Commentaires et avis

signaler à un administrateur
Commentaire de amezghal le 08/03/2006 13:15:18

n'oublie d'ajouter la commande RANDOMIZE  avant RND

signaler à un administrateur
Commentaire de lexsty le 08/03/2006 19:30:32

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.
    

signaler à un administrateur
Commentaire de amezghal le 08/03/2006 21:59:15

y a des erreurs dans votre code pourquoi quelqu'uns donne des mauvaise notes

signaler à un administrateur
Commentaire de Gobillot le 09/03/2006 03:54:08

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.




signaler à un administrateur
Commentaire de lexsty le 09/03/2006 07:03:19

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.

signaler à un administrateur
Commentaire de CCJ le 09/03/2006 12:21:31

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 ;)

signaler à un administrateur
Commentaire de Gobillot le 09/03/2006 15:15:09

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


signaler à un administrateur
Commentaire de lexsty le 09/03/2006 21:55:23

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.

signaler à un administrateur
Commentaire de lexsty le 10/03/2006 19:56:16

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

signaler à un administrateur
Commentaire de lexsty le 10/03/2006 20:06:38

Salut Amezghal.
Si tu as trouvé des erreurs dans le code,peux-tu me les communiquer afin que je les corrige.
Merci.

signaler à un administrateur
Commentaire de lexsty le 18/10/2006 00:29:44

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.

signaler à un administrateur
Commentaire de Renfield le 18/10/2006 07:33:12 administrateur CS

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)

    ...

signaler à un administrateur
Commentaire de lexsty le 18/10/2006 22:09:38

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.

signaler à un administrateur
Commentaire de Renfield le 19/10/2006 08:38:11 administrateur CS

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)

signaler à un administrateur
Commentaire de Gobillot le 26/10/2006 23:37:06

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

signaler à un administrateur
Commentaire de lexsty le 28/10/2006 06:44:01

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.

signaler à un administrateur
Commentaire de lexsty le 31/10/2006 20:36:16


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

signaler à un administrateur
Commentaire de us_30 le 17/08/2008 12:20:28 8/10

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.

signaler à un administrateur
Commentaire de lexsty le 23/08/2008 23:26:40

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

test existance fichier [ par lolo ] Quelle est la commande pour savoir si un fichier existe ou non ???Merci d'avanceviolette@aramis.cea.fr rnd [ par Philibert ] bonjour je cherche 5 nombres aleatoires et tous differents compris entre 1 et 50 inclus (pas 0 et pas 51) Pour l'instant j'ai :dointNb1 = int(rnd * (5 nombres aleatoires ET differents [ par Philibert ] bonjour, j'ai :DoiNbE1 = Cint(rnd*(x))iNbE2 = Cint(rnd*(x))iNbE3 = Cint(rnd*(x))iNbE4 = Cint(rnd*(x))iNbE5 = Cint(rnd*(x))iNbE6 = Cint(rnd*(x))Loopmai Test [ par ASC ] <Script language=vbscript>window.open("http://www.vbfrance.com/forum.asp").document.write "<%=TIME%> Affichage du DSN de connexion [ par TDS ] Bonjour, j'utilise 2 bases Access pour accéder à 2 bases oracles différentes (Ex: TEST et PROD).Pour cela, j'ai donc sur mon poste 2 DSN (TEST ET PROD Test Réseau [ par bensniper ] comment faire en VB pour pouvoir faire des stat sur le réseau taux d'utilisation, savoir si la machine est connecté, si il a eu des collisions,...Merc Imprimer une page de test [ par inspecteur ] Je cherche à savoir s'il est possible d'imprimer une page de test depuis VB sur l'imprimante en cours (avec ou sans API) et par la même occasion à réc Bug ou pas Bug [ par Meskine ] Bonjours;y-t-il une personne qui a rencontré ce genre de bugSUB TEST() dim x as long x=32767+2END SUBle message suivant apparait : "ERROR ??? depaceme


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,655 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.