Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#76 23-05-2016 21:06:35
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Bon, j'ai dit que je ne participais plus, mais comme ça m'intéresse ... alors.
Mon avis
1- tout ceci repose sur des considérations très compliquées, comme la gestion mémoire. Par exemple, le terme multiplicatif n'a certainement pas été pris au hasard. Je sais qu'il y a d'autre formules, mais je n'ai pas retrouvé ce que je cherchais sur le net.
2- un logiciel interprété résout très simplement des opérations simples, par contre, dès qu'on attaque des opérations répétitives, ce qui est notre cas, on ne sait pas très bien ce qui se passe, à part des gens hyper-pointus sur le sujet, ce qui n'est pas mon cas.
3- dans le contexte de langage interprété d'un éditeur de logiciel dont je garantis le sérieux, j'ai constaté des anomalies que je n'ai réussi à expliquer que par une interaction anormale entre la saisie et l'exécution (UNIX et/ou Windows). Naturellement ce genre d'anomalie n'est pas reproductible.
4- dans l'état actuel des machines, l'exécution d'un programme .exe donnera toujours les mêmes résultats avec les mêmes hypothèses. Je n'en dirais pas autant avec un programme interprété, sauf calcul très simple.
5- concernant l'anomalie d'exécution avec ma fonction dlz_rand, ça ne m'étonne pas vraiment. J'ai une version PHP dans ma machine, j'ai fait ce module dans le contexte qui est le mien, il n'y a pas beaucoup de raison qu'il fonctionne dans un autre contexte.
Pour en revenir au sujet principal, quelle est la question ?
Des différences de résultat pour une opération qui dépend de valeurs inconnues et de méthodes inconnues ? Ca peut durer longtemps.
J'ai constaté avec certains résultats une symétrie suspecte et un rapport ema/emq peu probable. Ceci m'a fait mettre en doute, suite à d'autres constatations, la fiabilité de tirages aléatoires réalisés par certains langages interprétés à finalité mathématique affichée.
Je sais bien que cette affirmation sera contredite par Léon "une expérience de loi uniforme produit une série de nombres dont les écarts à la moyenne arithmétique est conforme à la répartition Normale (loi normale)". Je sais très bien que cette affirmation est considérée comme hérétique, mais c'est exactement ce que dit le TCL.
Je veux bien continuer à jouer, si on précise les règles du jeu.
Hors ligne
#77 23-05-2016 21:55:24
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
5- concernant l'anomalie d'exécution avec ma fonction dlz_rand, ça ne m'étonne pas vraiment. J'ai une version PHP dans ma machine, j'ai fait ce module dans le contexte qui est le mien, il n'y a pas beaucoup de raison qu'il fonctionne dans un autre contexte.
S' il n'y a pas beaucoup de raison qu'il fonctionne dans un autre contexte, alors il faut éviter de l'utiliser car il n'est pas "robuste" et peut créer des soucis supplémentaires, non ?
Je sais bien que cette affirmation sera contredite par Léon "une expérience de loi uniforme produit une série de nombres dont les écarts à la moyenne arithmétique est conforme à la répartition Normale (loi normale)". Je sais très bien que cette affirmation est considérée comme hérétique, mais c'est exactement ce que dit le TCL.
oui, en effet, dit comme tu le fais là, c'est "hérétique" car tu oublies (systématiquement) la condition nécessaire du TCL : c'est faire des sommes. Il se trouve que ton programme fait des sommes quand il dénombre, ouf, on est dans les clous.
Pour en revenir sur le problème, j'aimerais que vous exécutiez ce petit programme, qui donne théoriquement le même résultat que celui du programme proposé par Dlzlogic. L'intérêt est qu'il est plus petit, plus simple, et permet de voir davantage de détails sur l’homogénéité des tirages... enfin, je l'espère...
#include <math.h>
int main()
{
int face=0 ;
int fois=0 ;
// srand (time (NULL)) ; // si on veut indexer la graine sur le temps machine
for (face=0; face<16; face++)
{
float var=0.;
for (fois=0; fois<1000; fois++)
{
// on réalise 1000 fois l'expérience suivante :
// on lance 16000 fois un dé à 16 faces et
// on compte le nombre de fois où on obtient "face"
int cpt=0 ;
int i=0 ;
for (i=0; i<16000; i++) if ( rand()%16 == face) cpt++ ;
float moy=1000.;
var +=(cpt-moy)*(cpt-moy);
}
float emq=sqrt(var/999.) ;
printf("face %i, ecart-type = %0.3f\n",face,emq) ;
}
return 0;
}
J'obtiens ces 16 valeurs
face 1, ecart-type = 32.112
face 2, ecart-type = 30.895
face 3, ecart-type = 30.695
face 4, ecart-type = 30.866
face 5, ecart-type = 32.096
face 6, ecart-type = 31.502
face 7, ecart-type = 30.175
face 8, ecart-type = 31.863
face 9, ecart-type = 31.729
face 10, ecart-type = 30.038
face 11, ecart-type = 29.060
face 12, ecart-type = 30.886
face 13, ecart-type = 30.627
face 14, ecart-type = 30.423
face 15, ecart-type = 31.408
En théorie, la bonne valeur est encore ici \( \sqrt{16000 . p .(1-p)} \) avec p=1/16, autrement dit 30.6
Et vous ? dites moi que vous obtenez des valeurs vers 25 , svp ! :)
Dlzlogic avec ton C ?
Yoshi avec DevC++ ?
Dernière modification par leon1789 (24-05-2016 07:24:43)
Hors ligne
#78 24-05-2016 07:42:03
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Variable aléatoire at fonction rand()
Salut,
CodeBlocks ou DevC++ donnent toujours la même sortie, y compris en relançant :
face 1, ecart-type = 34.721
face 2, ecart-type = 29.829
face 3, ecart-type = 30.954
face 4, ecart-type = 29.797
face 5, ecart-type = 34.675
face 6, ecart-type = 30.102
face 7, ecart-type = 31.087
face 8, ecart-type = 30.350
face 9, ecart-type = 34.465
face 10, ecart-type = 30.028
face 11, ecart-type = 30.921
face 12, ecart-type = 30.055
face 13, ecart-type = 34.596
face 14, ecart-type = 29.637
face 15, ecart-type = 30.895
Ce n'est plus le cas en activant le srand :
face 1, ecart-type = 29.934
face 2, ecart-type = 34.689
face 3, ecart-type = 29.820
face 4, ecart-type = 30.970
face 5, ecart-type = 30.448
face 6, ecart-type = 34.656
face 7, ecart-type = 29.917
face 8, ecart-type = 31.064
face 9, ecart-type = 30.388
face 10, ecart-type = 34.778
face 11, ecart-type = 30.011
face 12, ecart-type = 31.074
face 13, ecart-type = 34.803
face 14, ecart-type = 29.943
face 15, ecart-type = 31.079
Je vais essayer de traduire en Python, ce langage interprété (honni !) responsable de tous les tourments de Dizlogic
@+
Hors ligne
#79 24-05-2016 08:59:35
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
Cela ne donne plus 23 - 25 comme dans ton message #45.
Mais on constate un truc étrange dans ces résultats de CodeBlocks ou DevC++ : les écart-types ne sont pas homogènes !
ils sont soit compris entre 29.6 et 31, soit carrément supérieurs à 34 !
Choquant non ? :)
Hors ligne
#80 24-05-2016 13:20:56
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Bonjour,
On a donc réalisé l'expérience suivante : pour chacune des 16 faces d'un dé à 16 faces, on fait 1000 fois 16000 tirages.
Pour chacune des 16 faces on compte le nombre de sorties. Ci dessous les calculs de normalité
/* donné par Léon probablement avec "son C"
*/
29.832
32.112
30.895
30.695
30.866
32.096
31.502
30.175
31.863
31.729
30.038
29.060
30.886
30.627
30.423
31.408
FIN
Nombre de valeurs = 16 valeur minimale =29.06 valeur maximami=32.11
Rapport Emq/Ema = 1.25 Théorique = 1.25
Nombre = 16 Moyenne = 30.89 emq=0.87 ep=0.58
Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 1 6.25% théorique 2% |HHHHHHH
Classe 3 nb= 0 0.00% théorique 7% |
Classe 4 nb= 3 18.75% théorique 16% |HHHHHHHHHHHHHHHHHHH
Classe 5 nb= 5 31.25% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 6 nb= 2 12.50% théorique 25% |HHHHHHHHHHHHH
Classe 7 nb= 3 18.75% théorique 16% |HHHHHHHHHHHHHHHHHHH
Classe 8 nb= 2 12.50% théorique 7% |HHHHHHHHHHHHH
Classe 9 nb= 0 0.00% théorique 2% |
Classe 10 nb= 0 0.00% théorique 0.35% |
Manifestement, la répartition est normale
/* Yoshi avec DevC++
*/
30.074
29.934
34.689
29.820
30.970
30.448
34.656
29.917
31.064
30.388
34.778
30.011
31.074
34.803
29.943
31.079
FIN
Nombre de valeurs = 16 valeur minimale =29.82 valeur maximami=34.80
Rapport Emq/Ema = 1.19 Théorique = 1.25
Nombre = 16 Moyenne = 31.48 emq=1.99 ep=1.33Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 0 0.00% théorique 2% |
Classe 3 nb= 0 0.00% théorique 7% |
Classe 4 nb= 6 37.50% théorique 16% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 5 nb= 6 37.50% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 6 nb= 0 0.00% théorique 25% |
Classe 7 nb= 0 0.00% théorique 16% |
Classe 8 nb= 4 25.00% théorique 7% |HHHHHHHHHHHHHHHHHHHHHHHHH
Classe 9 nb= 0 0.00% théorique 2% |
Classe 10 nb= 0 0.00% théorique 0.35% |
Manifestation la répartition n'est pas normale.
Enfin, mon résultat :
/* Dlzlogic
*/
29.575
32.129
29.689
31.405
29.712
32.305
29.750
31.380
29.748
32.076
30.025
31.255
29.619
32.197
29.621
31.225
FIN
Nombre de valeurs = 16 valeur minimale =29.58 valeur maximami=32.31
Rapport Emq/Ema = 1.05 Théorique = 1.25
Nombre = 16 Moyenne = 30.73 emq=1.10 ep=0.73Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 0 0.00% théorique 2% |
Classe 3 nb= 0 0.00% théorique 7% |
Classe 4 nb= 7 43.75% théorique 16% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 5 nb= 1 6.25% théorique 25% |HHHHHHH
Classe 6 nb= 4 25.00% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHH
Classe 7 nb= 3 18.75% théorique 16% |HHHHHHHHHHHHHHHHHHH
Classe 8 nb= 1 6.25% théorique 7% |HHHHHHH
Classe 9 nb= 0 0.00% théorique 2% |
Classe 10 nb= 0 0.00% théorique 0.35% |
[HS] malheureusement les espacement ne sont pas respectés, flemme de le faire à la main.
Enfin, pourquoi s compliquer la vie ?
/* solution simple
*/
1003
1019
970
1042
971
1010
980
993
1008
1028
1017
960
990
1014
1049
946
FIN
Nombre de valeurs = 16 valeur minimale =946.00 valeur maximami=1049.00
Rapport Emq/Ema = 1.19 Théorique = 1.25
Nombre = 16 Moyenne = 1000.00 emq=29.18 ep=19.45Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 0 0.00% théorique 2% |
Classe 3 nb= 2 12.50% théorique 7% |HHHHHHHHHHHHH
Classe 4 nb= 3 18.75% théorique 16% |HHHHHHHHHHHHHHHHHHH
Classe 5 nb= 2 12.50% théorique 25% |HHHHHHHHHHHHH
Classe 6 nb= 6 37.50% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 7 nb= 1 6.25% théorique 16% |HHHHHHH
Classe 8 nb= 2 12.50% théorique 7% |HHHHHHHHHHHHH
Classe 9 nb= 0 0.00% théorique 2% |
Classe 10 nb= 0 0.00% théorique 0.35% |
Résultat assez correct
Il me semble qu'avant de faire des calculs, il serait utile de préciser ce qu'on cherche et le protocole pour le trouver.
Bonne journée.
Hors ligne
#81 24-05-2016 14:02:31
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Variable aléatoire at fonction rand()
Bonjour,
Sortie Python
avec floor(random.uniform(0.0,1.0)*16)
face : 1 ecart-type : 29.779755436098426
face : 2 ecart-type : 30.624873597827026
face : 3 ecart-type : 31.836120029591207
face : 4 ecart-type : 30.50950392631499
face : 5 ecart-type : 30.652627678285324
face : 6 ecart-type : 29.822279731240673
face : 7 ecart-type : 31.532845103484085
face : 8 ecart-type : 30.266699077915202
face : 9 ecart-type : 30.582368797744905
face : 10 ecart-type : 29.73631194765498
face : 11 ecart-type : 31.14821361187847
face : 12 ecart-type : 30.157610672622617
face : 13 ecart-type : 29.908017144061716
face : 14 ecart-type : 30.424704808143375
face : 15 ecart-type : 29.815767304900607
Je viens de revérifier ce qu'a relevé leon et qui l'a choqué : rien de changé. J'ai revérifié le prog : RAS.
Etrange...
@+
Dernière modification par yoshi (24-05-2016 14:31:18)
Hors ligne
#82 24-05-2016 14:16:52
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Voila la répartition.
Nombre de valeurs = 16 valeur minimale =29.61 valeur maximami=31.84
Rapport Emq/Ema = 1.24 Théorique = 1.25
Nombre = 16 Moyenne = 30.40 emq=0.66 ep=0.44Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 0 0.00% théorique 2% |
Classe 3 nb= 0 0.00% théorique 7% |
Classe 4 nb= 6 37.50% théorique 16% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 5 nb= 2 12.50% théorique 25% |HHHHHHHHHHHHH
Classe 6 nb= 5 31.25% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 7 nb= 1 6.25% théorique 16% |HHHHHHH
Classe 8 nb= 1 6.25% théorique 7% |HHHHHHH
Classe 9 nb= 1 6.25% théorique 2% |HHHHHHH
Classe 10 nb= 0 0.00% théorique 0.35% |
Hors ligne
#83 24-05-2016 14:35:54
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 401
Re : Variable aléatoire at fonction rand()
Re,
Avec un compilateur C en ligne : http://www.tutorialspoint.com/computer_ … /try_c.php
face 1, ecart-type = 30.671
face 2, ecart-type = 31.192
face 3, ecart-type = 29.925
face 4, ecart-type = 30.796
face 5, ecart-type = 29.478
face 6, ecart-type = 29.426
face 7, ecart-type = 30.949
face 8, ecart-type = 30.562
face 9, ecart-type = 29.587
face 10, ecart-type = 31.495
face 11, ecart-type = 29.507
face 12, ecart-type = 31.007
face 13, ecart-type = 30.705
face 14, ecart-type = 31.275
face 15, ecart-type = 29.855
CodeBlocks et DevC++ seraient-ils douteux ?
J'ai testé 2 autres compilateurs en ligne les 2 ont rejeté le prog avec 5 erreurs, dont une dès la première ligne : preprocessor directive expected... et une pour float moy = 1000;
@+
Hors ligne
#84 24-05-2016 16:52:20
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Voile la répartition des écarts à la moyenne :
31.280
30.671
31.192
29.925
30.796
29.478
29.426
30.949
30.562
29.587
31.495
29.507
31.007
30.705
31.275
29.855
FIN
Nombre de valeurs = 16 valeur minimale =29.43 valeur maximami=31.50
Rapport Emq/Ema = 1.11 Théorique = 1.25
Nombre = 16 Moyenne = 30.48 emq=0.73 ep=0.49Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 0 0.00% théorique 2% |
Classe 3 nb= 2 12.50% théorique 7% |HHHHHHHHHHHHH
Classe 4 nb= 4 25.00% théorique 16% |HHHHHHHHHHHHHHHHHHHHHHHHH
Classe 5 nb= 0 0.00% théorique 25% |
Classe 6 nb= 5 31.25% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 7 nb= 4 25.00% théorique 16% |HHHHHHHHHHHHHHHHHHHHHHHHH
Classe 8 nb= 1 6.25% théorique 7% |HHHHHHH
Classe 9 nb= 0 0.00% théorique 2% |
Classe 10 nb= 0 0.00% théorique 0.35% |
Evidemment, il y a un trou pour la classe 5, mais, vu qu'il y a 16 valeurs et 10 classes, on peut difficilement espérer mieux.
Je crois qu'aucun compilateur n'est douteux.
En fait les résultats "parfaits" tel que le rapport ema/ema = 1.25 me paraissent douteux. Je ne me souviens pas en avoir vus avec des séries réelles. De même que des symétries parfaites.
Ce qui peut être douteux, c'est la méthode de génération d'un nombre aléatoire. Par exemple, je soupçonne certains langages orientés mathématique qui fabriquent une liste de nombres (mis très rapidement sous forme de "matrice") qui correspond exactement à ce que peut attendre un étudiant qui a bien appris son cours.
Je n'ai jamais utilisé de compilateur C en ligne. Est-ce un compilateur qui produit un exécutable ou un interpréteur qui a une syntaxe identique à celle du C ?
Pour l'erreur sur "float moy = 1000;" il suffit peut-être de rajouter un point décimal à 1000.
Pour les directives de compilation, ça ne s'invente pas, ça doit être indiqué dans la doc.
Une directive de compilation commence par un dièse. ex
#define Toto 2564 sans point-virgule
Lors de la compilation Toto sera remplacé par 2564
autre exemple #ifdef #endif etc.
Hors ligne
#85 24-05-2016 17:24:41
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
message #80
/* Yoshi avec DevC++ */
(...)
Manifestation la répartition n'est pas normale.
Je suis absolument d'accord.
C'est donc qu'il y a un RNG assez défectueux dans le moteur dans ce cas.
CodeBlocks et DevC++ seraient-ils douteux ?
Je le crois fort. Je suis finalement surpris que le doute soit aussi flagrant, mais il faut bien voir les résultats, ils sont très étranges...
Enfin, mon résultat :
/* Dlzlogic */
(...)
je trouve qu'il y a un amas suspect de valeurs "inférieures", comprises entre 29.5 et 30 (intervalle de longueur 0.5),
alors que les valeurs "supérieures" se répartissent entre 31.2 et 33.2 (intervalle de longueur 2 !).
Ce déséquilibre me laisse douter du RNG aussi. Il faudrait travailler encore pour être sûr.
message #81
Sortie Python
avec floor(random.uniform(0.0,1.0)*16)
(...)
Je ne vois rien de choquant, ça roule.
message #83
Avec un compilateur C en ligne : http://www.tutorialspoint.com/computer_ … /try_c.php
(...)
Je ne vois rien de choquant, ça roule.
Hors ligne
#86 24-05-2016 17:52:21
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
A mon avis, si on veut tester un génarateur, il faudrait le faire avec un truc plus simple et un dé à 100 faces. par exemple :
{
int fois=0 ;
srand (time (NULL)) ; // si on veut indexer la graine sur le temps machine
int Res[100];
for (int i=0; i<100; i++) Res[i]=0;
for (fois=0; fois<10000; fois++)
{
// on lance 10000 fois un dé à 100 faces et
// on compte le nombre de fois de sortie de chaque face
Res[rand()%100]++ ;
}
for (int i=0; i<100; i++)
fprintf(espion,"%d\n",Res[i]) ;
system("pause"); //getch();
return 0 ;
}
Nombre de valeurs = 100 valeur minimale =80.00 valeur maximami=126.00
Rapport Emq/Ema = 1.27 Théorique = 1.25
la valeur 126.000000 rang 88 est douteuse
Nombre = 100 Moyenne = 100.00 emq=9.32 ep=6.21Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 2 2.00% théorique 2% |HH
Classe 3 nb= 6 6.00% théorique 7% |HHHHHH
Classe 4 nb= 16 16.00% théorique 16% |HHHHHHHHHHHHHHHH
Classe 5 nb= 24 24.00% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHH
Classe 6 nb= 27 27.00% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 7 nb= 17 17.00% théorique 16% |HHHHHHHHHHHHHHHHH
Classe 8 nb= 4 4.00% théorique 7% |HHHH
Classe 9 nb= 3 3.00% théorique 2% |HHH
Classe 10 nb= 1 1.00% théorique 0.35% |H
Là, on peut faire des comparaisons.
Dernière modification par Dlzlogic (24-05-2016 17:53:52)
Hors ligne
#87 24-05-2016 18:13:19
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
@ Léon, ce n'est pas parce que avec un test on obtient une répartition par très bonne (rapport ema/emq = 1.19, c'est tout de même pas mal pour 16 issues) avec DevC++ "qu'il y a un RNG assez défectueux dans le moteur dans ce cas. ".
Le RNG dépend de 2 choses, la formule et les paramètres de cette formules. Comme on ne connait ni l'un ni l'autre, seuls des test permettent de se faire une idée.
PS. Il est évident que si vous voulez mon outil de contrôle de normalité, c'est pas un problème.
Dernière modification par Dlzlogic (24-05-2016 18:21:47)
Hors ligne
#88 24-05-2016 21:47:29
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
Pour justifier mathématiquement qu'il y a effectivement un problème dans les résultats obtenus avec CodeBlocks et DevC++, il faut enquêter sur les caractéristiques des variables aléatoires.
Comme je vous le dis depuis le début, la valeur théorique de l'écart-type que l'on calcul est \( \sqrt{16000.p.(1-p)} \)~ 30.6 . De manière équivalente, la valeur théorique de la variance est $$ 16000.p.(1-p) = 937.5 $$
Mais quelle est la dispersion théorique des mesures autour de cette valeur de la variance ? On peut très bien répondre à cette question. Je ne vais pas détailler les calculs, disons simplement qu'on utilise la loi du khi² pour prouver ce que je vais écrire ( confer https://fr.wikipedia.org/wiki/Loi_du_%CF%87%C2%B2 ). Il en résulte que l'écart-type de la variance (oui, ça fait mal à la tête :) ) est $$ \sqrt{\frac{2}{1000}} . 16000.p.(1-p) \simeq 42 $$ ( confer https://fr.wikipedia.org/wiki/%C3%89car … empiriques )
Ainsi, on peut dire que notre variance suit une loi normale de moyenne 937.5 et d'écart-type 42
Par ailleurs, il est d'usage de dire que les mesures faites au delà de 3 écart-types sont improbables (probabilité inférieure à 0.003 , confer https://fr.wikipedia.org/wiki/%C3%89car … iagram.svg )
Ainsi, les mesures de notre variance ont toutes les chances de varier entre 937.5+3x42 et 937.5+3x42, autrement dit entre 811 et 1064.
Enfin, avec un coup de racine carrée, les mesures de notre écart-type ont toutes les chances de varier entre 28.47 et 32.62
Tout résultat obtenu en dehors de cet intervalle est très douteux...
Or dans les deux séries de résultats de Yoshi avec CodeBlocks ou DevC++ (message #78), c'est 25% des mesures qui sont supérieures à 34 ! C'est très très très douteux...
Mis à part CodeBlocks et DevC++, vous voyez nulle part des résultats se situant au-delà de 32... sauf dans 25% résultats avec le "C de Dlzlogic" (message #80). Cette valeur 32 correspond à l'ajout de 2 écart-types pour les mesures de variance, ce qui représente théoriquement moins de 2.5 % des résultats. Donc, avec les 25% comme dans le cas du "C de Dlzlogic", nous sommes encore dans un cas douteux.
Pour finir, toujours d'après la théorie, les deux tiers de nos écart-types doivent être compris entre \( \sqrt{937.5 - 42} \simeq 29.9 \) et \( \sqrt{937.5 + 42} \simeq 31.3 \).
Et cela se confirme très bien avec les résultats de Python, le C en ligne, et pas mal avec "mon C".
Hors ligne
#89 24-05-2016 21:57:48
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
@ Léon, ce n'est pas parce que avec un test on obtient une répartition par très bonne (rapport ema/emq = 1.19, c'est tout de même pas mal pour 16 issues) avec DevC++ "qu'il y a un RNG assez défectueux dans le moteur dans ce cas. ".
Un bon RNG doit produire des résultats "normaux" dans tous les cas, peu importe comment il s'y prend.
Par ailleurs, une constante correcte (ema/emq si tu veux, ou une autre, peu importe) ne prouve pas que la situation est cohérente (au mieux, ça permet d'envisager que la situation est cohérente).
Mais une constante (une fréquence par exemple) très marginale prouve que la situation est douteuse.
Hors ligne
#90 24-05-2016 22:17:23
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
@Léon,
""Un bon RNG doit produire des résultats "normaux" dans tous les cas, peu importe comment il s'y prend. "
Désolé, ça c'est une hérésie mathématique.
Je soupçonne certains logiciels de procéder comme ça.
Si tu veux continuer la discussion, précise le protocole et les tests. Là, tu fais de la philosophie.
Y'a un point que tu n'as pas évoqué, à partir d'une expérience aléatoire équiprobable, notion de base dans tous les générateurs, on obtient une répartition normale, ou presque, de la répartition des écarts à la moyenne. Cela ne t'empêche pas de dormir ?
Hors ligne
#91 25-05-2016 09:06:23
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
@Léon,
""Un bon RNG doit produire des résultats "normaux" dans tous les cas, peu importe comment il s'y prend. "
Désolé, ça c'est une hérésie mathématique.
ah bon. Tu veux dire qu'il n'existe pas de RNG qui soit bon ? Ou tu veux dire que tu acceptes d'utiliser un générateur qui donnent des résultats anormaux ?
Si tu veux continuer la discussion, précise le protocole et les tests. Là, tu fais de la philosophie.
c'est amusant de voir que la moindre formule mathématique, la moindre tentative d'explication, te fais basculer dans la méprise.
Détrompe toi, ce sont des mathématiques, rien à voir avec du blabla hors sujet.
Le protocole est très bien précisé, tout est dans le code C de mon message #77 . Tout comme c'était la cas dans ton message #19.
Les tests ont été réalisé par toi, yoshi et moi. Je ne vois pas ce que je dois préciser là-dessus. On peut évidemment les continuer...
Y'a un point que tu n'as pas évoqué, à partir d'une expérience aléatoire équiprobable, notion de base dans tous les générateurs, on obtient une répartition normale, ou presque, de la répartition des écarts à la moyenne. Cela ne t'empêche pas de dormir ?
Encore une fois, en utilisant des variables qui suivent une loi uniforme, on obtient une répartition (ultimement) conforme à la loi normale... oui, si on fait la somme de ces variables ! (ou une moyenne, qui est une somme divisée). C'est amusant que tu ne tiennes absolument à ne pas considérer explicitement cela, car ce que tu écris perd son sens.
Or des sommes, c'est justement ce que l'on fait dans nos tests, donc on est dans le cadre que tu connais.
La loi normale, j'en parle dans mon message #88 . Tu l'as vu ?
Dans notre dernier code, la variable cpt suit la loi binomiale B(16000, 1/16), qui est très proche d'une loi normale d'espérance \( m = 16000 / 16 = 1000 \) et d'écart-type \(s = \sqrt{ 16000.p.(1-p) } \) avec p=1/16 , ce qui donne s = 30.6 environ. Je n'en ai jamais parlé ??? car c'est justement cet écart-type que l'on essaie de retrouver par les tests, depuis le début !
Et dans mon message #88, j'explique (sans détailler, c'est vrai) que la variable var suit également la loi normale N(937.5 , 42) ... alors qu'est-ce que je n'ai pas évoqué ?
Si tu as une objection mathématique, n'hésite pas !
Hors ligne
#92 25-05-2016 11:52:15
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Bonjour Léon,
C'est vrai, c'est toujours difficile de communiquer.
Dlzlogic a écrit :
@Léon,
""Un bon RNG doit produire des résultats "normaux" dans tous les cas, peu importe comment il s'y prend. "
Désolé, ça c'est une hérésie mathématique.ah bon. Tu veux dire qu'il n'existe pas de RNG qui soit bon ? Ou tu veux dire que tu acceptes d'utiliser un générateur qui donnent des résultats anormaux ?
J'avais compris l'expression "résultats normaux" dans le sens stricte du terme "conforme à la norme".
On se propose dans ce topic de comparer des qualités de RNG. Y a-t-il une norme ? je ne crois pas. Donc il faut fixer une règle du jeu, cela consiste en gros à fixer les hypothèses avant d'analyser les conclusions.
Dans ton joli calcul, tu décides d'analyser et de comparer des séries de résultats. Ces variables sont le résultat de lois très compliquée (comptage, différence à une valeur, élévation au carré somme etc.) . Par contre, les valeurs sont équiprobable, c'est la raison pour laquelle il est légitime de comparer le résultat à la loi de Gauss.
Je sais bien que tu en es toujours à ne pas croire le TCL.
C'est très net quand tu expliques que la loi binomiale vient "avant" la loi normale, laquelle n'est qu'une approximation de la loi binomiale. Des professeurs utilisent la planche de Galton pour expliquer le phénomène. Maintenant, imagine une planche de Galton de dimension infinie. Tu aura le signe "intégrale" au lieu du sigma et tu auras la courbe de Gauss représentative de la loi normale.
Il est vrai que je n'avais pas lu le message #88. Je sais qu'on peut démontrer n'importe quoi, et même son contraire en matière de probabilités.
Je refuse catégoriquement ta formule de calcul de l'écart type. Je vais essayer d'expliquer pourquoi.
On fait une expérience de tirages iid, on obtient une courbe de Gauss à un instant t0. On reporte la limite de l'écart type. On sait que 66% des résultats sont compris entre les 2 bornes.
Sans rien changer on répète l'expérience en sur-impression et en cumulant le résultat des tirages à la courbe de Gauss. On aura une seconde courbe à l'instant t1, définissant une aire deux fois plus grande que celle à l'instant t0, mais plus pointues.
Bon, ce truc est marrant, je vais le simuler.
Hors ligne
#93 25-05-2016 13:15:57
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
J'avais compris l'expression "résultats normaux" dans le sens stricte du terme "conforme à la norme".
On se propose dans ce topic de comparer des qualités de RNG. Y a-t-il une norme ? je ne crois pas. Donc il faut fixer une règle du jeu, cela consiste en gros à fixer les hypothèses avant d'analyser les conclusions.
L'hypothèse est que le RNG fournit des valeurs qui suivent la loi uniforme.
La conclusion est que le nombres fournis par le RNG doivent vérifier les propriétés découlant de la loi uniforme.
(moyenne, variance, écart-type, TCL, etc)
Et là, visiblement, les tests ne collent pas vraiment avec la conclusion (au moins une propriété ne sont pas vérifiée, voire deux si on pense aussi à au programme initial des premières pages de la discussion), donc l'hypothèse est "douteuse".
Je sais bien que tu en es toujours à ne pas croire le TCL.
Je ne "crois" pas au TCL, je le sais démontré (depuis des siècles dans ses premières versions les plus simples) et je l'utilise dans mon explication, quand je dis que une loi binomiale peut être approcher raisonnablement par une loi normale.
En effet, la communication est délicate.
C'est très net quand tu expliques que la loi binomiale vient "avant" la loi normale, laquelle n'est qu'une approximation de la loi binomiale.
En effet, c'est exact.
Des professeurs utilisent la planche de Galton pour expliquer le phénomène. Maintenant, imagine une planche de Galton de dimension infinie. Tu aura le signe "intégrale" au lieu du sigma et tu auras la courbe de Gauss représentative de la loi normale.
En effet, c'est exact. Mais avant d'arriver à l'infini, tu prendras des nombres entiers, et là, c'est la loi binomiale qui opère rigoureusement. Ensuite, il y a des gens qui pose (légitimement pour l'application qu'il en font) 100 = infini par exemple. Du coup, ils utilisent la loi normale, plus facile pour les calculs que la loi binomiale.
Je refuse catégoriquement ta formule de calcul de l'écart type. Je vais essayer d'expliquer pourquoi.
On fait une expérience de tirages iid, on obtient une courbe de Gauss à un instant t0. On reporte la limite de l'écart type. On sait que 66% des résultats sont compris entre les 2 bornes.
Sans rien changer on répète l'expérience en sur-impression et en cumulant le résultat des tirages à la courbe de Gauss. On aura une seconde courbe à l'instant t1, définissant une aire deux fois plus grande que celle à l'instant t0, mais plus pointues.
Bon, ce truc est marrant, je vais le simuler.
J'ai rien compris...
Hors ligne
#94 25-05-2016 13:47:11
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
J'ai fait de petits essais et c'est assez marrant.
Donc, la méthode est la suivante : à mon code dans le message #86, j'ai rajouté une boucle de 1 à 10, et je cumule les résultats dans Res. Après la boucle 'fois', je calcule l'emq sur le contenu du tableau Res. Le premier coup la moyenne est 100, le second 200 etc.
Jeu=0 Moy=100.00 Emq=9.46
Jeu=1 Moy=200.00 Emq=10.03
Jeu=2 Moy=300.00 Emq=10.20
Jeu=3 Moy=400.00 Emq=9.51
Jeu=4 Moy=500.00 Emq=9.60
Jeu=5 Moy=600.00 Emq=9.85
Jeu=6 Moy=700.00 Emq=9.62
Jeu=7 Moy=800.00 Emq=9.45
Jeu=8 Moy=900.00 Emq=9.16
Jeu=9 Moy=1000.00 Emq=9.11
On observe que l'Emq reste constante. On vérifie ainsi les notions connues
1- Le nombre de mesures ou d'observations a peu d'influence sur le résultat, tout au moins à partir d'un certain nombre.
2- L'Emq étant constant, ou presque, la précision relative augmente avec le nombre de mesures. Ce n'est pas contradictoire avec la constatation précédente.
L'hypothèse est que le RNG fournit des valeurs qui suivent la loi uniforme.
La conclusion est que le nombres fournis par le RNG doivent vérifier les propriétés découlant de la loi uniforme.
(moyenne, variance, écart-type, TCL, etc)
Absolument. Je résume ces propriétés
1- La moyenne arithmétique est la valeur le plus probable de l'objet observé ou mesuré.
2- La loi uniforme n'a pas d'écart-type. C'est le résultat d'un tirage aléatoire suivant cette loi qui a un écart-type.
3- On ne peut parler de variance ou d'écart-type que dans le cal où le résultat suit la répartition dite "normale". Mais rien n'interdit de calculer l'écart moyen quadratique et l'écart moyen arithmétique. Si le rapport de ces deux valeurs est proche de 1.25, alors on peut considérer que la série résulte d'un tirage aléatoire.
Hors ligne
#95 25-05-2016 14:37:04
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
Avec ton exemple, tu montre que l'emq converge quand la taille de l'échantillon observé augmente. Ok, cela ne fait pas de doute.
2- La loi uniforme n'a pas d'écart-type.
Bien sûr que si...
La loi uniforme sur n entiers consécutifs a,a+1, ...,b-1, b a pour moyenne m=(a+b)/2 et écart-type \( \sqrt{ \frac{n^2-1}{12} } \)
Pour le prouver, je t'invite à calculer la somme \( \sum_{k=a}^b \frac{1}{n} (k - m)^2 \) avec b = a+(n-1). Cela donne exactement \( \frac{n^2-1}{12} \)
La loi uniforme sur l'intervalle [a,b] dans les réels a pour moyenne m = (a+b)/2 et écart-type \( \frac{b-a}{\sqrt{12} }\)
Pour le prouver, je t'invite à calculer l'intégrale \( \int_{a}^b \frac{1}{b-a} (x - m)^2 \ dx \) . Cela donne exactement \( \frac{(b-a)^2}{12} \)
C'est dans les livres et sur le web.
3- On ne peut parler de variance ou d'écart-type que dans le cal où le résultat suit la répartition dite "normale".
mais non... on peut parler des ces notions pour plein de lois (pas toutes, mais la plupart habituellement utilisées).
confer http://math.univ-lyon1.fr/~gannaz/Cours/TablesStat.pdf ...par exemple.
Mais dans notre contexte, la loi normale est bien là, en effet.
Dernière modification par leon1789 (25-05-2016 15:07:52)
Hors ligne
#96 25-05-2016 14:46:16
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
Voici ce que donne Maple :
"face ", 0, "ecart-type = ", 30.73246629
"face ", 1, "ecart-type = ", 30.62408913
"face ", 2, "ecart-type = ", 30.87920863
"face ", 3, "ecart-type = ", 30.51360484
"face ", 4, "ecart-type = ", 30.08744347
"face ", 5, "ecart-type = ", 31.24369005
"face ", 6, "ecart-type = ", 29.62714579
"face ", 7, "ecart-type = ", 29.59919107
"face ", 8, "ecart-type = ", 29.36771122
"face ", 9, "ecart-type = ", 31.67132888
"face ", 10, "ecart-type = ", 31.13717270
"face ", 11, "ecart-type = ", 30.63952971
"face ", 12, "ecart-type = ", 31.87987337
"face ", 13, "ecart-type = ", 30.85328062
"face ", 14, "ecart-type = ", 29.84638683
"face ", 15, "ecart-type = ", 31.14334452
Je vérifie mes prédictions :
pas de résultat au dessus de 32.6 : OK
éventuellement un résultat au dessus de 32, mais pas davantage : en fait, il n'y en a pas, OK
deux tiers des résultats entre 29.9 et 31.3 : en effet, on en voit 10 sur 16 , OK
Bon, ça roule, je ne vois pas de problème.
Hors ligne
#97 25-05-2016 15:06:56
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Nombre de valeurs = 16 valeur minimale =29.37 valeur maximami=31.88
Rapport Emq/Ema = 1.24 Théorique = 1.25
Nombre = 16 Moyenne = 30.62 emq=0.74 ep=0.49
Classe 1 nb= 0 0.00% théorique 0.35% |
Classe 2 nb= 0 0.00% théorique 2% |
Classe 3 nb= 2 12.50% théorique 7% |HHHHHHHHHHHHH
Classe 4 nb= 3 18.75% théorique 16% |HHHHHHHHHHHHHHHHHHH
Classe 5 nb= 1 6.25% théorique 25% |HHHHHHH
Classe 6 nb= 5 31.25% théorique 25% |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
Classe 7 nb= 3 18.75% théorique 16% |HHHHHHHHHHHHHHHHHHH
Classe 8 nb= 2 12.50% théorique 7% |HHHHHHHHHHHHH
Classe 9 nb= 0 0.00% théorique 2% |
Classe 10 nb= 0 0.00% théorique 0.35% |
Oui, c'est pas mal.
Le problème, je l'ai observé dans le cas où les nombres sont générés dans une matrice.
Souviens toi, on l'a aussi constaté dans l'exercice de gestion de stock.
Enfin, un peu de logique, si ce que tu affirmes était vrai, quel intérêt aurait-on à utiliser la méthode de Monte-Carlo ?
Hors ligne
#98 25-05-2016 15:49:52
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
Enfin, un peu de logique, si ce que tu affirmes était vrai, quel intérêt aurait-on à utiliser la méthode de Monte-Carlo ?
??
Je ne vois pas en quoi ce que j'annonce (preuve mathématique à l'appui, sauf gourrage de ma part toujours possible, mais encore faut-il me dire où, et j'aimerais des maths si possible) met en cause la méthode de Monte-Carlo.
Je mets en cause un certain RNG car les nombres qu'il génère suivant la loi uniforme ne vérifient pas certaines propriétés découlant de cette loi.
Hors ligne
#99 25-05-2016 17:23:55
- Dlzlogic
- Banni(e)
- Inscription : 25-04-2016
- Messages : 461
Re : Variable aléatoire at fonction rand()
Je ne vois pas en quoi ce que j'annonce (preuve mathématique à l'appui, sauf gourrage de ma part toujours possible, mais encore faut-il me dire où, et j'aimerais des maths si possible) met en cause la méthode de Monte-Carlos.
Tout simplement parce que si le résultat d'un tirage ne convergeait pas rapidement vers la moyenne, cette méthode serait sans intérêt. Si je me souviens bien, c'était assez bien expliqué dans l'article de Wiki. Or, ta loi loi uniforme ne converge vers rien de particulier. C'est le tirage aléatoire qui provoque la convergence rapide. Cf TCL.
Hors ligne
#100 25-05-2016 18:36:58
- leon1789
- Membre
- Inscription : 27-08-2015
- Messages : 1 203
Re : Variable aléatoire at fonction rand()
Léon a écrit :Je ne vois pas en quoi ce que j'annonce (preuve mathématique à l'appui, sauf gourrage de ma part toujours possible, mais encore faut-il me dire où, et j'aimerais des maths si possible) met en cause la méthode de Monte-Carlos.
Tout simplement parce que si le résultat d'un tirage ne convergeait pas rapidement vers la moyenne, cette méthode serait sans intérêt. Si je me souviens bien, c'était assez bien expliqué dans l'article de Wiki. Or, ta loi loi uniforme ne converge vers rien de particulier. C'est le tirage aléatoire qui provoque la convergence rapide. Cf TCL.
Ce n'est pas MA loi uniforme, c'est la loi uniforme, la même pour tout le monde (en théorie), celle que tu utilises quand tu écris rand() en C.
Je ne vois nulle part où je nie la convergence de la méthode de Monte-Carlo (rapide si tu veux, si tu penses que \( 1/ \sqrt{n} \) tend vite vers 0... généralement, on dit que c'est plutôt lent...). confer https://fr.wikipedia.org/wiki/M%C3%A9th … .C3.A9orie
Je ne mets pas en cause la théorie des probabilités, mais j'utilise la théorie des probabilités pour mettre le doute sur le RNG utilisé par le "DevC++ de Yoshi" et "ton C". Je ne dis pas que ces RNG ne servent à rien, bien que sûr qu'on peut les utiliser pour faire certaines choses, mais je dis qu'ils ne sont pas "ultra-conformes" à la loi uniforme qu'ils sont censés suivre... Par exemple, quand tu te bases sur de nombreux essais pour assurer la valeur 25 de l'emq (dixit ton message #15), il se trouve que ce résultat de 25 est faux, car c'est 30.6 (via preuve mathématique, et tu as vu que beaucoup de langages tournent autour de ce 30, sauf "ton C" et "le DevC++ de Yoshi" comme par hasard).
Hors ligne







