| Générateur de nombres pseudo-aléatoires | |
|
+5Klaus JL35 Yannick Marc papydall 9 participants |
Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Générateur de nombres pseudo-aléatoires Sam 3 Oct 2015 - 19:54 | |
| Je me suis amusé à coder un générateur de nombres pseudo-aléatoires. Puis j’ai généré une série de 10000 nombres aléatoires et j’ai vérifié le caractère aléatoire de la série en calculant la moyenne et l’écart-type. En effet, pour une distribution aléatoire uniforme entre 0 et 1, la moyenne de la distribution doit être de ½ (0.5) et son écart-type de 1/12 (0.289). Mon générateur s’est avéré conforme à la théorie, ce qui m’a fait plaisir comme si j’étais un gosse! NB : Pour avoir des valeurs aléatoires correctes, le temps entre deux appels doit être au minimum de 1s. - Code:
-
rem ============================================================================ rem Générateur de nombres pseudo-aléatoires rem Par Papydall rem ============================================================================ rem Génération de nombres pseudo-aléatoires distribués uniformément entre 0 et 1 rem selon la formule de Lehmer et l algorithme et les paramètres de rem Parker and Miller (1988): rem rem ____________________________ rem | | rem | x(i+1) = a * x(i) modulo c | rem |____________________________| rem rem rem Avec : rem a = 7^5 = 16807 rem c = 2^31 - 1 = 2147483647 rem Sa période est fixée par c rem ============================================================================
rem Appel : rem Aleat() <=== retourne un nombre pseudo-aléatoire [0..1[ dans la variable globale RAND
rem ============================================================================ dim i Application_Title "Générateur aléatoire Par Papydall" list 10 : top 10,50 : left 10,100 : height 10,380 : item_add 10,"RND Papydall" : item_add 10,"" list 20 : top 20,50 : left 20,300 : height 20,380 : item_add 20,"RND Panoramic": item_add 20,"" font_bold 10 : font_bold 20 : width 10,150 : width 20,150 for i = 1 to 25 : Aleat() : item_add 10,rand : item_add 20,rnd(1) : pause 1000 : next i Verif_Aleat(10000) terminate end rem ============================================================================
SUB Random() dim_local a,c,x,y a = 16807 : c = 2147483647 : x = a * seed : seed = mod(x,c) y = seed/c : ' normalisation par c rand = y END_SUB rem ============================================================================ ' Génération de la constante d'initialisation du générateur Random ' à partir de la date courante selon Anderson (1990) SUB GenerationSeed() if variable("ret") = 0 then dim ret dim_local t0,t1,t2,t3,t4,t5,lseed,t$,d$
t$ = time$ : ' Récupération de l'heure actuelle d$ = date$ : ' Récupération de la date actuelle
t0 = val(mid$(t$,7,8)) : ' secondes t1 = val(mid$(t$,4,2)) : ' minutes t2 = val(mid$(t$,1,2)) : ' heures
t3 = val(mid$(d$,1,2)) : ' Jour t4 = val(mid$(d$,4,2)) : ' Mois t5 = val(mid$(d$,7,4)) : ' année
' calcul du seed d'après l'algo d'Anderson (seed varie entre 0 et 2^31-1 lseed = t5 + 70*(t4 + 12*(t3 + 31*(t2 + 23*(t1 + 59*t0)))) ' s'assurer que seed est impair if even(lseed) = 1 then lseed = lseed - 1 ret = lseed END_SUB rem ============================================================================ SUB Aleat() if variable("rand") = 0 then dim rand if variable("seed") = 0 then dim seed GenerationSeed() : seed = ret : Random() END_SUB rem ============================================================================ SUB Verif_Aleat(NbTirage) dim_local i,Serie(NbTirage),Somme, Moyenne, EcartType,tex$ print " ..... Veuillez patienter, je calcule ....." ' Génération d'une série aléatoire de distribution uniforme for i = 0 to NbTirage : Aleat() : Serie(i) = rand : display : next i ' Vérification du caractère aléatoire de la série ' Pour une distribution aléatoire uniforme entre 0 et 1, la moyenne de ' la distribution doit être de 0.5 et son écart 0,289 (1/12) Somme = 0 for i = 0 to NbTirage : Somme = Somme + Serie(i) : next i Moyenne = Somme / NbTirage
Somme = 0 for i = 0 to NbTirage : Somme = Somme + (Serie(i) - Moyenne)*(Serie(i) - Moyenne) : next i EcartType = sqr(Somme/Nbtirage) tex$ = "Moyenne : " + str$(Moyenne) + " pour " + str$(NbTirage) + " tirages" + chr$(13) tex$ = tex$ + "Ecart type : " + str$(EcartType) + " pour " + str$(NbTirage)+" tirages"+ chr$(13)+chr$(13) tex$ = tex$ + "Pour une distribution aleatoire uniforme entre 0 et 1," +chr$(13) tex$ = tex$ + "pour un nombre infini de tirages" + chr$(13) tex$ = tex$ + "- la moyenne vaut 0.5" + chr$(13) tex$ = tex$ + "- l'ecart-type vaut 1/12 soit 0.289" message tex$
END_SUB rem ============================================================================
Edit : Pour obtenir une série d’entiers aléatoires entre 0 et 100, modifier la ligne 30 comme ceci et comparez - Code:
-
for i = 1 to 25 : Aleat() : item_add 10,int(rand*100) : item_add 20,int(rnd(100)) : pause 1000 : next i | |
|
| |
Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Générateur de nombres pseudo-aléatoires Dim 4 Oct 2015 - 9:13 | |
| Merci Papydall !
Testé avec succès. Idem pour la sortie du programme qui ne fait pas BEEP ! (Sic) | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 4 Oct 2015 - 11:49 | |
| Testé et approuvé ! Voilà qui pourrait faire l' objet d' un petit cours sur les nombres aléatoires dans une rubrique mathématiques ou d' un petit article.....
Dernière édition par ygeronimi le Lun 5 Oct 2015 - 4:37, édité 1 fois | |
|
| |
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Générateur de nombres pseudo-aléatoires Dim 4 Oct 2015 - 15:23 | |
| Un petit court mais pas trop long... Bon, eh bien je corrige moi aussi, parce que du coup ce que j'ai dit ne veut plus rien dire...
Dernière édition par JL35 le Lun 5 Oct 2015 - 9:50, édité 1 fois | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Dim 4 Oct 2015 - 17:12 | |
| Ygeronimi a troqué son té contre une esse. On peut être dessinateur (T) ou boucher (S), personne n’est parfait !
C'est la faute à JL35, moi je sors. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Générateur de nombres pseudo-aléatoires Lun 5 Oct 2015 - 3:35 | |
| En voyant ton excellent générateur de nombres aléatoires, je me pose la question de la comparaison entre ta procédure, la fonction RND(V) de Panoramic et la fonction res% = DLL_call1("RandomValue",maxi%) de KGF.dll. Laquelle de ces 2 solutions est la "meilleure" sur le plan de la nature aléatoire des résultats ? j'avais l'impression que RandomValue est meulleure que Rnd, mais je peux me tromper. Pourrais-tu faire un comparatif de ces 3 solution ? | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 5 Oct 2015 - 4:39 | |
| J' ai corrigé mais que ce soit un cours court ou un article long je suis preneur. | |
|
| |
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Générateur de nombres pseudo-aléatoires Lun 5 Oct 2015 - 9:17 | |
| | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 0:11 | |
| - Klaus a écrit:
- En voyant ton excellent générateur de nombres aléatoires, je me pose la question de la comparaison entre ta procédure, la fonction RND(V) de Panoramic et la fonction res% = DLL_call1("RandomValue",maxi%) de KGF.dll. Laquelle de ces 2 solutions est la "meilleure" sur le plan de la nature aléatoire des résultats ? J’avais l'impression que RandomValue est meulleure que Rnd, mais je peux me tromper. Pourrais-tu faire un comparatif de ces 3 solutions ?
En ce moment, j’ai deux problèmes et j’espère que le proverbe « jamais deux sans trois » ne soit pas vrai ! 1er problème : Aujourd’hui j’ai consulté mon ophtalmo pour une détérioration sensible de ma vue : diagnostic : nécessité d’une opération chirurgicale dans un mois. 2ème problème : Difficulté de navigation sur internet : une lenteur exaspérante, comme si ma mauvaise vision ne suffisait pas ! Bon, ce sont des soucis personnels et je vous en fais grâce. Pour revenir au générateur pseudo-aléatoire, je commence à faire des tests sur celui de Panoramic RND() , sur le générateur que j’ai posté ci-haut ALEAT() et sur celui de Klaus « DLL_call1("RandomValue",maxi%) de KGF.dll. ». 1ère constatation : DLL_call1("RandomValue",maxi%) de KGF.dll. fournit toujours la même série. - Code:
-
dim i list 10 : top 10,10 : left 10,020 : height 10,400 : item_add 10,"RandomValue,100" : item_add 10,"" dll_on "kgf.dll" for i = 1 to 25 item_add 10,DLL_call1("RandomValue",100) ' On obtient toujours la même série : 1 , 4 , 87 , 21 , 28 , 68 , 32 , 17 etc. next i
Par contre RND() et ALEAT() fournissent toujours des séries différentes. Je ne peux rien conclure, pour le moment sans pousser les tests. Je coderais les tests suivants ( dans le(s) jour(s) à venir) • Test d’équidistribution • Test de répartition bidimensionnelle • Test de l’analyse graphique de la répartition bidimensionnelle • Les statistiques suivantes 1- Moyenne des tirages pairs 2- Moyenne des tirages impairs 3- Ecart type des tirages impairs 4- Ecart type des tirages pairs 5- La Covariance 6- Le Coefficient de corrélation Je posterais peut-être d’autres codes pour d’autres générateurs. Affaire à suivre ... | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 0:24 | |
| Merci, Papydall, ça donne déjà une première idée, et j'ai de quoi réfléchir sur mon code. J'ai pourtant pris soin d'initialiser la racine à chaque appel, mais j'ai dû faire une erreur? Ceci dit, la routine retourne évidemment une valeur arrondie à l'entier le plus proche, étant donné que dll_callx ne sait retourner que des entiers. Je vais revoir ça...
Les yeux, c'est embêtant, et je te souhaite sincèrement de passer ce mauvais moment le mieux possible, pour constater une amélioration après la convalescence ! Courage ! | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 0:28 | |
| | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 0:57 | |
| J'ai constaté qu'il y a un oubli dans la doc de RandomValue ! Si tu passes un paramètre négatif (-1 par exemple), la racine aléatoire sera randomisée. Donc, pour le test, je te suggère de procéder comme suit: - Code:
-
label start dim i, m1% m1% = 0 - 1 list 10 : top 10,10 : left 10,020 : height 10,400 button 1 : left 1,200 : caption 1,"Start" : on_click 1,start dll_on "kgf.dll" end start: clear 10 item_add 10,"RandomValue,100" : item_add 10,"" i = DLL_call1("RandomValue",m1%) for i = 1 to 25 item_add 10,DLL_call1("RandomValue",100) ' On obtient toujours la même série : 1 , 4 , 87 , 21 , 28 , 68 , 32 , 17 etc. next i return Je vais corriger la doc de cette fonction ! | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 2:43 | |
| J’ai remarqué pour le 1er appel : resultat = DLL_call1("RandomValue",n%) Si n% < 0 , alors resultat vaut 0 Si n% >= 0, alors resultat vaut 1 Le 1er appel est un RANDOMIZE Donc, on appelle RANDOMIZE() puis Random(n%) - Code:
-
rem ============================================================================ list 10 : top 10,10 : left 10,020 : height 10,400 dll_on "kgf.dll" Randomize() Random(100) end rem ============================================================================ SUB Random(n%) dim_local i item_add 10,"RandomValue,"+str$(n%) : item_add 10,"" for i = 1 to 25 item_add 10,DLL_call1("RandomValue",n%) next i END_SUB rem ============================================================================ SUB Randomize() dim_local bidon bidon = DLL_call1("RandomValue",0-1) END_SUB rem ============================================================================
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 2:56 | |
| - Citation :
- Si n% < 0 , alors resultat vaut 0
Si n% >= 0, alors resultat vaut 1 C'est presque ça... Il faut lire: - Citation :
- Si n% < 0 , alors resultat vaut 0
Si n% >= 0, alors resultat vaut la valeur aléatoire d'ailleurs, dans ton code (procedure Random), tu l'utilises bien comme ça. | |
|
| |
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 7:42 | |
| Bon courage pour ces moments difficiles Papydall ! Quand a la lenteur sur internet, je crois que l'on y est tous confronté, plus ou moins a un moment ou a un autre. Chez moi, ça revient de manière cyclique. et c'est très désagréable.... | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 9:54 | |
| Merci Minibug pour ton soutien. | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 10:13 | |
| Les opérations aux yeux ... Pfff ... ça veut dire que pendant plusieurs jours tu risques de ne plus pouvoir programmer... inadmissible !!! Bon sérieusement, bon courage, moi j'ai eu aussi très jeune et ce n'est pas le genre de trucs que l'on souhaite faire trop souvent ... | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 10:57 | |
| Merci Jicehel
J’ai toujours appris à faire avec le peu de choses que j’ai. Je m’y adapterai. "Mieux vaut allumer une bougie que maudire les ténèbres." | |
|
| |
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 18:37 | |
| | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 19:53 | |
| Du coté obscur, passer, il ne faut pas. Grande est la médecine.
Bon courage Papydall. | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Générateur de nombres pseudo-aléatoires Mar 6 Oct 2015 - 23:07 | |
| Merci Minibug. Merci Jean Claude. Nous avons d'excellents chirurgiens ophtalmologues, Dieu merci. | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 7 Oct 2015 - 9:12 | |
| Si cela est nécessaire, mieux vaut faire une pause écran que de se retrouver avec un écran noir.
Je te souhaite de nous revenir avec un regard tout neuf.
Ps : Attention les gars, plus une faute n' échappera à Papydall.
| |
|
| |
Contenu sponsorisé
| Sujet: Re: Générateur de nombres pseudo-aléatoires | |
| |
|
| |
| Générateur de nombres pseudo-aléatoires | |
|