Bonjour à tous, surtout aux gens spécialistes des probabilités et de tests des générateurs de nombres pseudo-aléatoires
A la fin, je déclare "douteux" un générateur de nombres pseudo aléatoires. Ai-je raison, ai-je une justification correcte ? c'est ma question...
Venons en aux faits. Voici un code C que j'explique ci-dessous :
Rapide explication du programme :Code:#include <stdio.h> #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; }
- On demande 16000 tirages aléatoires d'un nombre entre 0 et 15, suivant la loi uniforme par hypothèse.
- On compte le nombre de fois où le nombre 0 est apparu (variable cpt) : l'espérance est évidemment 16000 / 16 = 1000.
- On calcule la somme des écarts quadratiques entre la variable cpt et l'espérance sur 1000 tirages (variable var).
- On recommence 15 fois les trois lignes précédentes avec les nombres 1,2,...,15 (variable face).
- On estime alors l'écart-type de la loi sous-jacente (variable emq) ;
De manière théorique, il est clair que la variable cpt suit la loi binomiale B( 16000 , 1/16 ) donc la valeur de la variable emq doit tourner autour de l'écart-type de cette loi binomiale, à savoir avec p=1/16, autrement dit 30.6 environ.
On teste en machine en lançant le programme, on obtient ce résultat :
Les écart-types tournent autour de 30.6 comme prévu. Mais la dispersion des écart-types m'interroge... Je poursuis donc avec une étude mathématique pour déterminer si la dispersion des écart-types est douteuse ou pas.Code:face 0, ecart-type = 29.575 face 1, ecart-type = 32.129 face 2, ecart-type = 29.689 face 3, ecart-type = 31.405 face 4, ecart-type = 29.712 face 5, ecart-type = 32.305 face 6, ecart-type = 29.750 face 7, ecart-type = 31.380 face 8, ecart-type = 29.748 face 9, ecart-type = 32.076 face 10, ecart-type = 30.025 face 11, ecart-type = 31.255 face 12, ecart-type = 29.619 face 13, ecart-type = 32.197 face 14, ecart-type = 29.621 face 15, ecart-type = 31.225
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
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 est
( confer https://fr.wikipedia.org/wiki/%C3%89...pes_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 supérieures à espérance + 2 écart-types sont peu probables (probabilité de 0.025 , confer https://fr.wikipedia.org/wiki/%C3%89...on_diagram.svg )
Ainsi, les mesures de notre variance ont toutes les chances de varier entre 937.5+2x42 et 937.5+2x42, autrement dit entre 853 et 1022.
Enfin, avec un coup de racine carrée, les mesures de notre écart-type ont beaucoup de chance de varier en dessous de
Or quand on regarde les résultats de la machine, cette valeur 32 est dépassée 4 fois, soit 25% du temps ... Comparer cela aux 2.5% : c'est 10 fois plus !
J'en conclus que le générateur de nombres pseudo aléatoires est douteux.
Etes-vous d'accord ?
Merci de m'avoir lu jusqu'ici...
-----