Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#376 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 19:24:09

Dlzlogic a écrit :
Léon a écrit :

Encore un motif de suspecter gravement ce sacré DevC++

Je ne peux pas lire cela sans réagir
1- l'opération consiste à cumuler 16000 fois un nombre de moyenne 50. On dépasse la précision d'un float qui est de 7 chiffres significatifs.

Tu veux qu'on remplace "float" par "double" ? Ca ne peut pas faire de mal, c'est vrai.

Mais vu que 50.229  > 50.093 à cause de la 3ième décimale, je pense que le passage ne jouera pas beaucoup, voire pas du tout.


Dlzlogic a écrit :

2- l'écart-type se calcule avec les valeurs observées. Il n'y a pas à ma connaissance de formule théorique de valeur d'écart type.

la formule est dans le programme :
pour la loi uniforme sur les éléments {0, ...., face-1}, la moyenne est \( \frac{face-1}{2} \) et l'écart-type est \(  \sqrt{\frac{face^2-1}{12} } \)
(confer mon message #95)

Cet écart-type théorique sert à calculer l'intervalle de fluctuation (à 99%) de la moyenne observée. Ainsi on peut voir si la moyenne observée est "douteuse" ou pas.

Dlzlogic a écrit :

3- l'opération est faite avec 2 variables (x et y). On ne peut donc pas apprécier la dispersion.

ces deux variables x et y prennent successivement 16000 valeurs !! Avec 16000 valeurs chacune, on peut apprécier leur dispersion (pour x et pour y).


Dlzlogic a écrit :

4- la "co-variance nulle" n'est qu'une motion mathématique abstraite.
Cette valeur, étant le rapport de deux variables réelles, elle ne peut être nulle que sur le papier.

Ben vois les résultats : les covariances obtenus sont tout de même assez proches de 0, en tout cas dans l'intervalle théorique (centré en 0).
Je ne comprends pas pourquoi la co-variance n'est qu'abstraite : elle est utilisée pour calcul le coefficient de corrélation :
coefficient de corrélation (X,Y) = co-variance(X,Y) / écart-type(X).écart-type(Y)
( confer http://www.jybaudot.fr/Correlations/r.html par exemple )
En quelque sorte, le coefficient de corrélation est la co-variance normalisée...

Dlzlogic a écrit :

5- il y a deux jours, ta formule de la variance était différente. Que s'est-il passé ?

Où ça, s'il te plait ?

(C'est possible qu'elle soit différente, si elle se réfère à une loi différente.)

#377 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 18:01:38

merci Yoshi pour tes résultats.

Mais tes deux premiers tableaux avec DevC++ sont identiques . un copier / coller trop rapide :)

Cela étant, on voit une espérance (ou moyenne) se trouver au delà de l'intervalle précisé...
Encore un motif de suspecter gravement ce sacré DevC++

#378 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 17:42:59

Avec le "C en ligne" http://www.tutorialspoint.com/computer_ … /try_c.php

esperances = 49.607 et 49.551 , theorie (99) [ 48.907, 50.093 ]
variances = 844.146 et 825.321 , theorie (99) [ 817.933, 848.567 ]
co-variance = -8.823 , theorie (99) [ -17.127, 17.127 ]

c'est exactement les mêmes résultats que "mon C" !
Et en activant la germination srand :

esperances = 49.193 et 49.498 , theorie (99) [ 48.907, 50.093 ]
variances = 822.255 et 825.116 , theorie (99) [ 817.933, 848.567 ]
co-variance = -0.395 , theorie (99) [ -17.127, 17.127 ]

ce qui paraît ok.

#379 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 17:37:03

avec MAPLE :

esperances = 49.15700000 et 49.89487500
variances = 834.6355000 et 830.7966250
co-variance = 10.49512500

ce qui paraît ok.

#380 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 16:59:37

Je reviens encore une fois avec un programme en C pour tester un RNG. Il se base uniquement sur un calcul de moyenne, de variance et de co-variance.
Pourquoi variance ? plus facile à étudier mathématiquement que l'écart-type (étudier l'écart-type est difficile à cause de sa racine carrée)
Pourquoi la co-variance ? pour vérifier un peu l'indépendance des tirages successifs ( indépendance => co-variance nulle)

En fait, on peut comparer les résultats obtenus aux valeurs théoriques précisées à l'affichage :
la probabilité d'être à l'intérieur de l'intervalle théorique est de 99% (moyenne +- 2.6 * écart-type).
Donc se retrouver à l'extérieur est assez suspect.

Le nombre de tirages est "fois = 16000" ; le nombre de faces est "face = 100" ;

On tire deux séries de 16000 entiers entre 0 et 99 , puis on calcule leur moyennes, variances, et co-variance.


#include <stdio.h>
#include <math.h>

int main()
{
  int face=100 ;
  int fois=16000 ;

  double m=(face-1)/2. ; // esperance de rand()%face
  double v=(face*face-1)/12. ; // variance de rand()%face
  double w=(face*face-4)*(face*face-1)/180. ; // variance de variance de rand()%face

  // srand (time (NULL)) ; // si on veut indexer la graine sur le temps machine

  double esp_x=0 ; double esp_y=0 ;
  double var_x=0 ; double var_y=0 ;
  double co_var=0 ;
  int i=0 ; int x=0 ; int y=0 ;
  for (i=0; i<fois; i++)
  {
    x = rand()%face ; y = rand()%face ;
    esp_x += x ; esp_y += y ;
    var_x += (x-m)*(x-m) ; var_y += (y-m)*(y-m) ;
    co_var += (x-m)*(y-m) ;
  }

  esp_x = esp_x / fois ; esp_y = esp_y / fois ;
  var_x = var_x / fois ; var_y = var_y / fois ;  
  co_var = co_var / fois ;

  double esp_min = m - 2.6*sqrt(v/fois) ;
  double esp_max = m + 2.6*sqrt(v/fois) ;

  double var_min = v - 2.6*sqrt(w/fois) ;
  double var_max = v + 2.6*sqrt(w/fois) ;

  double co_var_min = 0 - 2.6*sqrt(v*v/fois) ;
  double co_var_max = 0 + 2.6*sqrt(v*v/fois) ;

  printf("esperances = %0.3f et %0.3f , theorie (99) [ %0.3f, %0.3f ] \n",esp_x, esp_y, esp_min, esp_max) ;
  printf("variances = %0.3f et %0.3f , theorie (99) [ %0.3f, %0.3f ] \n",var_x, var_y, var_min, var_max) ;
  printf("co-variance = %0.3f , theorie (99) [ %0.3f, %0.3f ] \n",co_var, co_var_min, co_var_max) ;

return 0;
}
 

Avec "mon C", j'obtiens :

esperances = 49.607 et 49.551 , theorie (99) [ 48.907, 50.093 ]
variances = 844.146 et 825.321 , theorie (99) [ 817.933, 848.567 ]
co-variance = -8.823 , theorie (99) [ -17.127, 17.127 ]

ce qui parait ok.

Et vous ?

#381 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 16:14:24

Dlzlogic a écrit :
Léon a écrit :

en effet, c'est une réaction rapide et facile. Tu as lu ma réponse à cette réaction ?

Ben, naturellement. D'ailleurs elle (celle d'origine) est parfaitement justifiée.

Donc c'est pas choquant qu'un phénomène d'une probabilité 1 / 1800 se produise du premier coup.
Donc qu'une pièce de monnaie tombe douze fois du même coté consécutivement ne te choque pas.
Moi, je trouve cela assez anormal...

Dlzlogic a écrit :

Les probabilités n'ont pas beaucoup de relations avec les proportions.

ah bon ?

#382 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 15:16:44

en effet, c'est une réaction rapide et facile. Tu as lu ma réponse à cette réaction ?

#383 Re : Café mathématique » Variable aléatoire at fonction rand() » 26-05-2016 14:22:29

Merci pour le source de rand
Et si je te dis qu'on utilise 16000 ?

#384 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 18:36:58

Dlzlogic a écrit :
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).

#385 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 15:49:52

Dlzlogic a écrit :

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.

#386 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 14:46:16

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.

#387 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 14:37:04

Avec ton exemple, tu montre que l'emq converge quand la taille de l'échantillon observé augmente. Ok, cela ne fait pas de doute.

Dlzlogic a écrit :

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.


Dlzlogic a écrit :

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.

#388 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 13:15:57

Dlzlogic a écrit :

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".

Dlzlogic a écrit :

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.

Dlzlogic a écrit :

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.

Dlzlogic a écrit :

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.

Dlzlogic a écrit :

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...

#389 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 09:06:23

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 ?

Dlzlogic a écrit :

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...

Dlzlogic a écrit :

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 !

#390 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 21:57:48

Dlzlogic a écrit :

@ 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.

#391 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 21:47:29

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".

#392 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 17:24:41

message #80

Dlzlogic a écrit :

/* 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.

yoshi a écrit :

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...


Dlzlogic a écrit :

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

yoshi a écrit :

Sortie Python
avec  floor(random.uniform(0.0,1.0)*16)
(...)

Je ne vois rien de choquant, ça roule.

message #83

yoshi a écrit :

Avec un compilateur C en ligne : http://www.tutorialspoint.com/computer_ … /try_c.php
(...)

Je ne vois rien de choquant, ça roule.

#393 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 08:59:35

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 ? :)

#394 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 21:55:24

Dlzlogic a écrit :

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 ?

Dlzlogic a écrit :

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

J'obtiens ces 16 valeurs

face 0, ecart-type = 29.832
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++ ?

#395 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 20:18:34

yoshi a écrit :

Le code que j'ai transcrit en C++ produit des résultats comparables que ce soit avec CodeBlocks ou DevC++ qui n'utilisent pas le même compilateur.
Le code C fourni  produit des résultats comparables que que ce soit avec CodeBlocks ou DevC++... Alors ?

Ton code C++ donne des valeurs vers 30, et ton code C donne des valeurs vers 25, c'est bien ça ?
Alors ? ben je ne comprends pas grand chose... Si seulement j'avais un code qui donne 25, arf...

#396 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 20:03:50

J'ai un intel i7 Q720 4 coeurs, Windows 7.
Mais le code C, je l'ai compilé sous linux...

#397 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 19:01:59

yoshi a écrit :

Pour moi, il n'y a pas de RNG dans un compilateur (je peux me tromper, bien sûr). Pour quoi faire ?

Ok, mais où est-il alors ? Dans le coeur du microprocesseur ?

yoshi a écrit :

Sinon, il n'y a pas de raison qu'il n'y ait pas un double de chaque instruction...
Le compilateur traduit en langage machine les instructions du programme.
Je présume que chaque instruction du code C par exemple se trouve déjà traduit, pour n'avoir plus qu'à assembler les morceaux.
Ainsi on pourrait penser que la traduction est incorrecte...
Je pense que ça se saurait depuis le temps. Le compilateur MinGW que j'ai utilisé pour compiler le prog de Dizlogic est un compilateur libre i.e. dont le code source est à la disposition de chacun, ergo, il y a des milliers de développeurs de par le monde qui ont dû scruter ce code source et qui auraient réagi.

Je suis d'accord avec toi, mais alors comment expliquer les différences entre 25 et 30 que vous observez avec ce simple programme ? (on pourrait surement le simplifier pour isoler le problème, afin de mieux le comprendre.) Je dis "vous", car de mon coté, je n'arrive pas à obtenir ce 25... même avec du code php ou en C.

#398 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 18:14:59

Je peux te demander les résultats d'exécution chez toi pour Nb=16000
avec d'une part la fonction dlz_rand
et d'autre part rand simplement ?

Dlzlogic a écrit :

Pour les premiers, regarde ce que tu as teinté en vert sur ton message #64, pour les seconds, c'est noté dans ton message #52.

ok, donc on peut conclure que la différence de résultat vient de la différence au niveau du code, à savoir cette fonction rand versus dlz_rand,
non ?

#399 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 18:02:24

Pour nous tous, j'ai trouvé ce site web qui permet de tester en ligne du code PHP : http://phptester.net/
On colle le code ci-dessous (j'ai enlevé tout ce qui concerne la gestion de fichier du code de Dlzlogic)
et on l'exécute en cliquant sur "Click to test your code" en haut de la page web. Le résultat est affiché (après quelques secondes...)
à droite la page. C'est facile.


<?php
//---------------------------------------------------------------------------
  $Seed_lo = (double)microtime()*1000; //)(int)1111;
  settype($Seed_lo,"integer");
  $MULTIPLIER = (int)0x015a4e35;
  $INCREMENT = (int)1;
  echo("Initialisation Seed=" . $Seed_lo . " Mul = ".$MULTIPLIER." Inc = ".$INCREMENT."<br>");

  function dlz_rand()
  {
    global $Seed_lo;
    global $MULTIPLIER;
    global $INCREMENT;
//    echo("Seed=" . $Seed_lo . " Mul = ".$MULTIPLIER." Inc = ".$INCREMENT."<br>");
    $Seed_lo = (int)($MULTIPLIER * $Seed_lo + $INCREMENT);
    $s= (int)($Seed_lo >> 16) & 0x7fff;
//    echo($s." ");
    return($s);
  }

  echo("Début du traitement  RAND_MAX= ".getrandmax()."\n<br>");

  $Nb=16000;
  $Memq=0.0;
  $emqMin=10000.0;
  $emqMax=0.0;
  $NbFois=100;
  for ( $fois=0; $fois < $NbFois; $fois++)
  {
    for ($i=0; $i<16; $i++) $Res[$i]=0;
// tire à pile ou face 16000 fois, chaque groupe de 4 résultat successif forment un nombre de 0 à 15
    for ($i=0; $i<$Nb; $i++)
    {
      $ra=rand(); $a=$ra%2;
      $rb=rand(); $b=$rb%2;
      $rc=rand(); $c=$rc%2;
      $rd=rand(); $d=$rd%2;
      $r=$a*8 + $b*4 + $c*2 + $d;
      $Res[$r]++;
    }
    $moy=$Nb/16.0;
    $emq=0.0;
// Calcul de l'erreur moyenne quadratique appelée "écart-type"
    for ($i=0; $i<16; $i++)
    {
      $emq = $emq + ($Res[$i]-$moy)*($Res[$i]-$moy);
    }
    $emq=sqrt($emq/16.0);
    $Memq = $Memq + $emq;
    $emqMin= $emq < $emqMin ? $emq : $emqMin;
    $emqMax= $emq > $emqMax ? $emq : $emqMax;

  }
  $Memq/=$NbFois;
  printf("Nb=%d  emqMin=%0.3f emqMax=%0.3f emqMoy=%0.3f\n", $Nb,$emqMin,$emqMax,$Memq);
  return;
?>
 

Avec ce code utilisant la fonction de base rand de php, on obtient
Initialisation Seed=937 Mul = 22695477 Inc = 1
Début du traitement RAND_MAX= 2147483647
Nb=16000 emqMin=16.886 emqMax=42.838 emqMoy=29.484

Initialisation Seed=236 Mul = 22695477 Inc = 1
Début du traitement RAND_MAX= 2147483647
Nb=16000 emqMin=15.764 emqMax=43.836 emqMoy=30.923

etc. ce qui est conforme à la valeur théorique.


Et si on utilise la fonction dlz_rand


(...)
    for ($i=0; $i<$Nb; $i++)
    {
      $ra=dlz_rand(); $a=$ra%2;
      $rb=dlz_rand(); $b=$rb%2;
      $rc=dlz_rand(); $c=$rc%2;
      $rd=dlz_rand(); $d=$rd%2;
      $r=$a*8 + $b*4 + $c*2 + $d;
      $Res[$r]++;
    }
(...)
 

alors là, c'est très étrange...
Initialisation Seed=824 Mul = 22695477 Inc = 1
Début du traitement RAND_MAX= 2147483647
Nb=16000 emqMin=3872.725 emqMax=3872.983 emqMoy=3872.981

Si on décommente la ligne     echo($s." ");
qui figure dans la fonction dlz_rand , histoire de voir les nombres générés,
alors il s'affiche 25851 5244 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ....

?!

#400 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 17:35:47

Dlzlogic, merci pour le code.

Je peux te demander les résultats d'exécution chez toi pour Nb=16000
avec d'une part la fonction dlz_rand
et d'autre part rand simplement ?

Pied de page des forums