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

#26 21-05-2016 10:51:03

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Tant que j'y suis, voici un code Maple et 100 écart-types :


 ecart := proc() local L,i,moy,emq ;
    L := array(0..15, [0$16]) :
    to 16000 do i := rand(0..15)() ; L[i] := L[i]+1 od :
    L := convert(L, list) ;
    moy := 1000 ;
    emq := add((i-moy)^2, i=L) ;
    emq := sqrt(emq/16.) ;
    return(emq);
 end :

 # 100 ecart-types sur 16000 tirages
 s := seq(ecart(), i=1..100) ;

  s := 39.15035121, 39.62480284, 34.93207695, 34.24178734,
        29.50000000, 23.64582416, 25.46811732, 36.54278315,
        26.74883175, 20.47559523, 28.09359358, 26.17250466,
        35.75087412, 34.88015195, 27.67896313, 28.04906416,
        29.48304598, 17.75176048, 29.38749734, 26.07201565,
        20.30394050, 32.14420632, 32.73377461, 30.81192951,
        34.97320403, 32.93554311, 34.78505426, 34.39840113,
        28.15803615, 30.42408585, 28.68361902, 27.57489801,
        27.81860888, 25.26113616, 30.73475232, 26.41022529,
        34.65544690, 30.13303835, 26.76985245, 30.11851590,
        20.31009601, 25.85053191, 28.53725635, 32.28776858,
        30.94349689, 28.03346215, 29.56983260, 19.93426698,
        26.55183609, 25.18928344, 25.96150997, 41.55718951,
        26.43624406, 28.82056557, 23.07054399, 25.35251467,
        28.15803615, 33.02461203, 34.17418616, 34.71671067,
        33.23966005, 26.20591536, 25.11473671, 24.47192269,
        21.43595111, 33.23777971, 43.82921400, 20.12150591,
        46.34112644, 26.04803256, 27.68122107, 31.72932398,
        27.39525506, 33.72869698, 40.90690651, 34.67708177,
        29.85799725, 38.56325972, 26.01441908, 37.99342048,
        27.40665977, 43.20445579, 39.79321550, 28.50219290,
        28.81622807, 25.38946632, 25.21904043, 33.73981328,
        28.50657819, 31.03022720, 28.85307609, 27.49318097,
        31.63463292, 21.07130751, 39.04804733, 36.62819952,
        19.35200248, 23.34255770, 29.17190429, 32.77766008

 # min, max, moyenne des écart-types
 min(s), max(s), add(i, i=[s]) / 100 ;

                17.75176048, 46.34112644, 29.91531726
 

Ca ressemble aux résultats de Yoshi

Hors ligne

#27 21-05-2016 11:14:36

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Variable aléatoire at fonction rand()

Salut,

https://docs.python.org/2/library/random.html
Voilà la page de la doc...

Voilà une série de 100 mini, maxi parmi les 10 que j'obtiens avec ce code :

from math import floor,sqrt
from random import random

for k in range(10):
    somme_emq,Liste_emq=0,[]
    for fois in range(100):
        mini,maxi=100,0
        Res=[0]*16    
        for i in range(16000):
            a=floor(random()*2)
            b=floor(random()*2)
            c=floor(random()*2)      
            d=floor(random()*2)
            r=a*8+b*4+c*2+d
            Res[r]+=1
        moy=float(1000)
        emq=float(0)
        for i in range(16):
            emq+=(Res[i]-moy)*(Res[i]-moy)
        emq=sqrt(emq/16)
        #print(emq/100)
        Liste_emq.append(emq)
        print (min(Liste_emq),max(Liste_emq))
    print("\n")

32.05854020382088 32.05854020382088
27.14083639094418 32.05854020382088
27.14083639094418 32.17530108639234
27.14083639094418 32.810059433045836
23.748684174075834 32.810059433045836
23.539859812666684 32.810059433045836
23.539859812666684 32.810059433045836
23.539859812666684 33.015148038438355
23.539859812666684 33.015148038438355
23.539859812666684 33.015148038438355
23.539859812666684 39.309668022001915
23.539859812666684 39.309668022001915
23.539859812666684 39.309668022001915
23.539859812666684 39.309668022001915
23.539859812666684 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
23.22713929867387 39.309668022001915
11.75265927354316 39.309668022001915
11.75265927354316 39.309668022001915
11.75265927354316 39.309668022001915
11.75265927354316 39.309668022001915
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 42.699531613356136
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925
11.75265927354316 43.14510400960925

Je vais refaire en tenant compte de la mise en garde sur les bookeeping fonctions (dont fait partie mon random)...
.....
Pas si simple à utiliser. Je cherche !

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#28 21-05-2016 11:41:22

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Mille pardon, je suis en retard de plusieurs réponses. Je suis entrain de me battre avec PHP. Il y a des années que je n'en ai plus fait, alors j'ai un peu de mal.
Je vais recalculer avec emq, min et max.
Mais il ne faut pas oublier que ces 3 valeurs ne représentent que la dispersion autour de la moyenne. 25 ou 30 ne sont que des écarts types, c'est à dire une évaluation de la dispersion. Il me parait normal qu'un programme compilé donne un résultat avec moins de dispersion qu'un programme interprété.

Hors ligne

#29 21-05-2016 12:12:57

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Voila un résultat :
emq moy=23.356 Min=10.724  Max=39.003
J'appelle résultat 100 fois l'opération suivante
Tirage de 16000 pile ou face, groupés par 4 pour former un nombre de 0 à 15.
Ce nombre est l'indice d'un tableau, donc à 16 positions. On cumule les résultats pour chaque indice, puis calcul d'écart à la moyenne et calcul de l'emq.
Le "résultat" est la moyenne des 100 emq, le min et le max.
On observe que la moyenne des Min et Max est proche de 25.
(J'ai relu très soigneusement mon code, d'autant que j'ai rajouté les calculs du résultat qui hier était fait à partir des 100 emq pris en tant que liste.

Hors ligne

#30 21-05-2016 12:24:52

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Léon a écrit :

Disons qu'entre 29 et 31, ça colle à la valeur théorique, donc rien de surprenant. Alors que 25, c'est loin de la valeur théorique, donc là, c'est étrange.

Je crains que tu appelles "valeur théorique" la valeur calculée avec la formule simplificatrice de la loi binomiale. Cette formule n'est valable que dans des limites assez restreintes que je ne connais d'ailleurs pas.

Hors ligne

#31 21-05-2016 12:43:59

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

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

Disons qu'entre 29 et 31, ça colle à la valeur théorique, donc rien de surprenant. Alors que 25, c'est loin de la valeur théorique, donc là, c'est étrange.

Je crains que tu appelles "valeur théorique" la valeur calculée avec la formule simplificatrice de la loi binomiale. Cette formule n'est valable que dans des limites assez restreintes que je ne connais d'ailleurs pas.

Justement, la loi binomiale est la loi exacte de l'expérience : quand on compte le nombre de fois qu'on a obtenu i (entier entre 0 et 15), on fait la somme de 16000 variables qui suivent la loi de Bernoulli (de paramètre 1/16) : c'est pour cela que je parle de la loi binomiale ayant pour paramètre n=16000 et p=1/16.
C'est la loi normale qui la forme simplifiée (c'est justement les premières versions du TCL).

Dlzlogic a écrit :

Voila un résultat :
emq moy=23.356 Min=10.724  Max=39.003

Ok, je vais regarder cela en C, car ces moyennes proches de 25 sont étranges : elles montrent une anomalie, comme tu dis (car la théorie, Maple, javascript, Python, donnent des valeurs entre 29 et 31...)

Dernière modification par leon1789 (21-05-2016 12:52:45)

Hors ligne

#32 21-05-2016 13:16:53

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Si on fait 32000 tirages au lieu de 16000.
Alors la moyenne sera bien 2000.
Je ne comprends pas très bien ton calcul.

Hors ligne

#33 21-05-2016 17:11:27

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Pour la loi binomiale de paramètres n (nombre d'essais) et p (probabilité de succès pas essai), on prouve que
la moyenne est de n.p , i.e. dans notre cas c'est 16000 * 1/16 = 1000,
et d'écart-type (n.p.(1-p))^0.5 , i.e. dans notre cas c'est (16000 * 1/16 * 15/16)^0.5 ~ 30.6

Bien évidemment, les deux formules en gras se démontrent. C'est dans les bouquins ou sur le web.

Dans notre histoire, chaque variable Res(i) suit la cette loi binomiale B(16000, 1/6)

Dernière modification par leon1789 (21-05-2016 17:13:32)

Hors ligne

#34 21-05-2016 17:47:02

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Si tu le dis, alors tout va bien. Plus on fait d'observations d'une même chose, en l'occurrence la fabrication d'un nombre de 0 à 15 à partir de bits aléatoires, plus on augmente l'écart-type.
Moi y'en a  pas comprendre.

Hors ligne

#35 21-05-2016 18:17:18

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Ben oui, si tu avances de 32000 pas aléatoires avant-arrière, tu arrives en générale plus loin (soit en avant, soit en arrière) du point de départ qu'avec 16000 pas. C'est des probas élémentaires.

Le problème est de comprendre comment on peut obtenir des écart-types de 25 car ce n'est pas une valeur normale pour cette expérience.

Hors ligne

#36 21-05-2016 18:32:50

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Bon, te fatigue pas, c'est pas la peine.
Tu sais pour une expérience aléatoire, l'écart-type est l'erreur moyenne quadratique. Au numérateur, on a des carrés d'écarts à la moyenne, au dénominateur le nombre de valeurs. Les grands écarts sont rares, donc ils n'influent que très peu, proportionnellement, au numérateur, et le dénominateur croit si on augmente le nombre de mesure de cette même chose.
Je sais que je suis hérétique, mais là, il y a des limites.

Hors ligne

#37 21-05-2016 19:15:36

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Bon, pour trouver la même moyenne, je pense que la meilleure méthode est de diminuer le nombre de tirages, peut-être 12000, par exemple. Le nombre trouvé avec le module C va augmenter, celui que tu calcules va diminuer. On tombera d'accord. Mais bien-sûr, rien à voir avec les maths.   
Mais franchement, j'ai plus envie de jouer.

Hors ligne

#38 21-05-2016 22:31:48

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

Je suis entrain de me battre avec PHP. Il y a des années que je n'en ai plus fait, alors j'ai un peu de mal.
Je vais recalculer avec emq, min et max.

et tu obtiens quel résultat ?

Dlzlogic a écrit :

Il me parait normal qu'un programme compilé donne un résultat avec moins de dispersion qu'un programme interprété.

ah bon ? Pour quelle raison ?


Dlzlogic a écrit :

Bon, pour trouver la même moyenne, je pense que la meilleure méthode est de diminuer le nombre de tirages, peut-être 12000, par exemple. Le nombre trouvé avec le module C va augmenter, celui que tu calcules va diminuer.

Oui, si on passe de 16000 à 12000, l'écart-type de la loi binomiale va effectivement diminuer : précisément, il va être autour de $$(12000.p.(1-p))^{0.5}$$ avec p=1/16 , donc 26.5 (donc diminution par rapport à 30.6 pour 16000 tirages, en effet).
Tiens, voici deux pages web pour bien voir cela :
avec 16000 tirages : http://leon1789.perso.sfr.fr/tmp/simult … logic.html ...écart-type autour de 30 en moyenne...
avec 12000 tirages : http://leon1789.perso.sfr.fr/tmp/Copie% … logic.html ...écart-type autour de 26 en moyenne...

Et pourquoi celui de C augmenterait ??? si on fait le même changement (passer de 16000 à 12000), ça devrait avoir le même effet, non ?

Dlzlogic a écrit :

Mais bien-sûr, rien à voir avec les maths.

Justement, ce sont les formules de la théorie des probabilités qui indiquent ce que l'on trouvera... C'est ça les maths.

Dlzlogic a écrit :

Mais franchement, j'ai plus envie de jouer.

Mais je suis absolument sérieux !

Dlzlogic a écrit :

Je sais que je suis hérétique, mais là, il y a des limites.

franchement... tu ne vois pas que la formule théorique d'écart-type que je te donne (à savoir (n.p.(1-p))^0.5 , qui figure partout dans les livres et sur le web) colle avec tous les résultats d'expérience que yoshi et moi avons postés. Cela ne te questionne pas ??

Moi, ce qui me questionne, c'est comment tu as obtenu cette valeur moyenne d'écart-type de 25, et comment cela pourrait augmenter si on diminue le nombre de tirages de 16000 à 12000 ... car c'est contraire à la théorie, et aux résultats d'expériences. J'ai bien un explication mathématique possible, mais j'aimerais qu'on y arrive ensemble.

Bref, passe à 12000 tirages, et dis nous quel résultat tu obtiens, merci d'avance. Tu clames souvent que personne ne veut faire de simulation avec toi, alors là c'est bien, on en fait des simulations. ;)

En attendant, voici une exécution MAPLE, avec 12000 tirages :


 ecart := proc() local L,i,moy,emq ;
    L := array(0..15, [0$16]) :
    to 12000 do i := rand(0..15)() ; L[i] := L[i]+1 od :
    L := convert(L, list) ;
    moy := 12000/16. ;
    emq := add((i-moy)^2, i=L) ;
    emq := sqrt(emq/16.) ;
    return(emq);
 end :

 # 100 ecart-types sur 12000 tirages
 s := seq(ecart(), i=1..100) ;

  s := 28.93311252, 38.07229964, 26.32489316, 23.69862865,
        31.59113800, 25.42144764, 32.36510467, 22.77608395,
        25.59785147, 32.96209945, 34.16686992, 18.50675552,
        20.85665361, 28.16025568, 26.45751311, 26.87005769,
        31.35482419, 26.52357442, 26.47404389, 23.71181140,
        26.97915862, 23.92697223, 16.08182204, 16.82631867,
        30.18277655, 22.24578612, 22.99728245, 14.08012784,
        28.70322282, 27.53179980, 24.31306233, 26.35336791,
        26.76518261, 34.33110834, 28.18022356, 29.06673356,
        26.72779452, 31.00000000, 30.24896692, 25.11971337,
        24.93992783, 28.97412639, 22.81994741, 21.59571717,
        15.34600925, 20.81165539, 30.54095611, 22.45829468,
        27.56129533, 27.50454508, 20.57304061, 21.94880407,
        29.06673356, 26.34150717, 16.34778272, 22.69636535,
        25.47547841, 21.78302091, 26.36522331, 32.82719909,
        21.95165142, 32.97347419, 28.74456470, 19.83368347,
        26.93742749, 26.67630034, 19.24512925, 21.16601049,
        36.88156721, 23.85634088, 28.17578748, 30.36856928,
        21.07427342, 29.48516576, 25.15949125, 20.13703057,
        34.26733138, 20.08730943, 30.24070105, 28.10916221,
        28.89420357, 27.29010810, 19.41326866, 23.56639557,
        24.04163056, 20.04370225, 30.93339619, 25.47547841,
        39.77436360, 24.68299009, 14.88287607, 37.37980738,
        22.16979928, 29.31723043, 22.17825512, 32.30711996,
        25.93742470, 25.19672598, 25.40177159, 28.75108694

 # min, max, moyenne des écart-types
 min(s), max(s), add(i, i=[s]) / 100 ;

                14.08012784, 39.77436360, 26.01472668
 

Et là aussi, moyenne de 26, proche de la valeur théorique annoncée à 26.5 (pour 12000 tirages).

Hors ligne

#39 21-05-2016 22:38:32

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

NbTirages = 32000  emq moy=6.868 Min=3.674  Max=10.428
NbTirages = 12000  emq moy=24.286 Min=18.695  Max=28.410

A mon avis l'explication est très simple : ta loi binomiale calcule suivant un triangle. Les probabilités sont conforme à la répartition de la loi normale, cf. TCL, c'est à dire que la représentation des écarts est celle de la courbe de Gauss..
A mon avis, tu fais un amalgame ou une confusion entre les proportions et les probabilités.
En matière de probabilités le principe est très simple, plus le nombre de mesures ou d'observation est grand, meilleur est la précision du résultat, mathématiquement, cela se traduit par une diminution de l'intervalle d'incertitude, c'est à dire par une diminution de la valeur numérique de l'écart-type.
Quand je dis que je n'ai plus envie de jouer, je suis vraiment sérieux. Si on veut jouer, il faut que chacun accepte les règles du jeu. J'ai l'impression que ce n'est pas ton cas. Le TCL est très clair, le résultat d'une expérience aléatoire est conforme à la loi normale. La loi binomiale et surtout ses formules n'ont rien à voir ici.
Il me parait tellement évident que plus on fait d'observations d'une même chose, meilleure sera la précision, donc plus petit sera l'écart type. (pardon, je me répète).
Je sais bien, parce que plusieurs personnes compétentes me l'on dit, que les notions élémentaires de probabilité étaient peu connues. J'y peux rien. Le drame, c'est que c'est au programme dès le lycée. Souviens-toi des discussions à propos du biais. Il s'agit d'une notion inventée par les mathématiciens et qui possède trois définitions différentes et impossibles à uniformiser.
Encore une fois, je sais que je suis hérétique, mais ce qui me rassure, c'est que je ne suis pas le seul.     

J'ai lu dernièrement un cours de préparation à l'agreg (lien donné par ton ami Sy.). Il "démontre" ou affirmé A puis dit que A==>B, puis B==>C ... donc C==>A. Je simplifie, mais je suis sérieux. Doc et commentaire à ta disposition.

Pour conclure, j'ai plus envie de jouer. Mais, et c'est mon doit, ça ne m'empêche pas de réagir si l'occasion se présente.
Bonne nuit.

Hors ligne

#40 21-05-2016 23:10:47

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Visiblement, les sessions MAPLE, et javascript te laissent de marbre.
Pour 32000 tirages : http://leon1789.perso.sfr.fr/tmp/Copie% … logic.html ... écart-type autour de 43 en moyenne ...
C'est logique car la formule de la loi binomiale indique (32000.p.(1-p))^0.5 avec p=1/16 , ce qui donne 43.3


Dlzlogic a écrit :

En matière de probabilités le principe est très simple, plus le nombre de mesures ou d'observation est grand, meilleur est la précision du résultat, mathématiquement, cela se traduit par une diminution de l'intervalle d'incertitude, c'est à dire par une diminution de la valeur numérique de l'écart-type.

Mais dans notre cas, on ne change pas le nombres d'observations : ce nombre est toujours de 100 ! Tu ne l'as pas modifié, hein ?

Ce que l'on change, c'est le nombre de tirages pour obtenir les écart-types à observer : 16000 ou 12000 ou 32000 tirages.  Et là, plus on augmente le nombre de tirages, plus les écart-types augmentent (tout comme la moyenne bien évidemment : 16000/16 ou 12000/16 ou 32000/16).


Dlzlogic a écrit :

NbTirages = 32000  emq moy=6.868 Min=3.674  Max=10.428
NbTirages = 12000  emq moy=24.286 Min=18.695  Max=28.410

Si je fais tourner ton code donné message #19, en remplaçant 16000 par 32000 ou 12000 (boucle "i"), tout en gardant 100 expériences (boucle "fois"), je vais obtenir cela ? C'est ce que tu prétends.

Ok, je vais le faire tourner en C

Hors ligne

#41 22-05-2016 08:49:27

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Voici ton code en C utilisant 16000 tirages (avec les déclarations de type là où il faut) :


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

int main() // suivant 154
{
  int fois=0 ;
    float emq=0.;
    float min_emq=1000.;
    float max_emq=0.;
    float moy_emq=0.;

//  srand (time (NULL)) ; // si on veut indexer la graine sur le temps machine
 
  for (fois=0; fois < 100; fois++)
  {
// on réalise 100 fois l'expérience suivante
    int Res[16];
    int i=0 ;
    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<16000; i++)
    {
      int a=rand()%2;
      int b=rand()%2;
      int c=rand()%2;
      int d=rand()%2;
      int r=a*8 + b*4 + c*2 + d;
      Res[r]++;
    }

    float moy=1000.;
    emq=0.;
// Calcul de l'erreur moyenne quadratique appelée "écart-type"
    for (i=0; i<16; i++)
    {
      emq+=(Res[i]-moy)*(Res[i]-moy);
    }
    emq=sqrt(emq/16) ;

    min_emq = min_emq < emq ? min_emq : emq ;
    max_emq = max_emq > emq ? max_emq : emq ;
    moy_emq += emq ;

  }
  moy_emq =moy_emq /100 ;

  printf("minimum : %0.3f\n",min_emq) ;
  printf("maximum : %0.3f\n",max_emq) ;
  printf("moyenne : %0.3f\n",moy_emq) ;
  return 0;
}
 

compilation : gcc -c test.c -o test.o ; gcc test.o -o test -lm ;

Résultat pour 16000 tirages (moyenne de 16000/16 = 1000 ), sur 100 expériences :
minimum : 19.209
maximum : 45.123
moyenne : 29.483
... c'est conforme à ce que yoshi et moi avons eu avec Python, javascript, Maple et la théorie !
cf http://leon1789.perso.sfr.fr/tmp/simult … logic.html

Maintenant avec 12000 tirages (moyenne de 12000/16 = 750 ), sur 100 expériences :
minimum : 14.474
maximum : 37.797
moyenne : 25.806
... c'est conforme à ce que j'ai eu avec javascript, Maple et la théorie !
cf http://leon1789.perso.sfr.fr/tmp/Copie% … logic.html

Maintenant avec 32000 tirages  (moyenne de 32000/16 = 2000 ), sur 100 expériences :
minimum : 26.098
maximum : 63.795
moyenne : 41.679
... c'est conforme à ce que j'ai eu avec javascript et la théorie !
cf http://leon1789.perso.sfr.fr/tmp/Copie% … logic.html

Pour rappel :

Dlzlogic a écrit :

NbTirages = 32000  emq moy=6.868 Min=3.674  Max=10.428
NbTirages = 16000  emq moy=23.356 Min=10.724  Max=39.003
NbTirages = 12000  emq moy=24.286 Min=18.695  Max=28.410

-----------

Nous t'avons fait des simulations dans 4 langages différents (avec ton propre code) et une explication théorique avec la loi binomiale, tout cela coïncide très bien. On ne retrouve aucun des résultats que tu as annoncés, que se soit avec 16000 tirages ou 32000... Pour 12000, nos deux résultats sont proches sur la valeur moyenne, mais pas du tout sur le max et le min observés (pour toi, le max et le min sont très proches de la moyenne).

As-tu une explication sérieuse autre que "tu n'acceptes pas les règles, tu confonds ceci cela, ce sont des choses peu connues mais évidentes pour moi" ?
Si mes simulations sont incorrectes, merci de me dire précisément où sont les erreurs : soyons précis et concis, inutile de partir des laïus hors sujet.
Par exemple, que donne mon code si tu le compiles et exécutes chez toi ?

Hors ligne

#42 22-05-2016 11:24:02

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Variable aléatoire at fonction rand()

Bonjour,

J'ai passé la matinée  à traduire (je n'avais que très très vagues notions) le code en C++..
Après 5 fois 100 essais (de 16000 tirages) :
min            max          moyenne arithmétique
18.434      45.5               30.6348
18.9885     47.4263          30.1125
16.0293     43.4799          29.9763
18.2106     41.411            29.6439
18.6765     45.0479          30.0907

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#43 22-05-2016 12:28:46

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Bonjour Léon,
Ben, j'ai rajouté randomize (ou srand, c'est pareil), j'ai imprimé dans un fichier, et comme c'est le même code que celui que je t'avais donné, j'obtiens la même chose qu'avec mon code.
Si tu expliques aux statisticiens qu'en augmentant le nombre de mesures ou d'observations on augment la valeur de l'écart-type, tu auras beaucoup de succès.
A part cela, je n'ai pas d'explication.

Hors ligne

#44 22-05-2016 13:33:35

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

Si tu expliques aux statisticiens qu'en augmentant le nombre de mesures ou d'observations on augment la valeur de l'écart-type, tu auras beaucoup de succès.

Comme je te l'ai dit, on ne change pas le nombre d'observations ! Regarde par quoi on divise dans le programme : ce n'est pas par 16000 ou 32000...

Les statisticiens savent très bien que l'écart-type d'une somme \(X_1 + ... + X_k\) de k variables indépendantes augmente quand k augmente : on dit (tu le sais toi aussi !) que les écart-types s'ajoutent quadratiquement (autrement dit, les variances s'additionnent). Ce ne te rappelle rien ?!
Donc quand on passe de k=16000 à k=32000, on double le nombre k de variables, et l'écart-type est multiplié par un facteur \( \sqrt 2 \) ... le pire, c'est que tu le sais...

Dlzlogic a écrit :

Bonjour Léon,
Ben, j'ai rajouté randomize (ou srand, c'est pareil), j'ai imprimé dans un fichier, et comme c'est le même code que celui que je t'avais donné, j'obtiens la même chose qu'avec mon code.
A part cela, je n'ai pas d'explication.

Bizarre qu'un même code donne deux résultats différents. As-tu un moyen pour nous laisser télécharger ton fichier de session ?

Et quant à nos 5 simulations (C++, python pour Yoshi ; maple, javascript, C pour moi) qui donnent des résultats de moyenne d'emq conformes à la valeur théorique \( (n.p.(1-p))^{0.5} \), tu en penses quoi ?

Hors ligne

#45 22-05-2016 13:40:55

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Variable aléatoire at fonction rand()

Re,

J'ai testé en Python (10 fois) :
Avec 12000 tirages (moyenne de 12000/16 = 750 ), sur 100 expériences :
      mini                              maxi                      moyenne
18.347343131908772    40.09052257080219    26.719777514061807
14.933184523068078    42.1218470630147    26.045478478818733
12.96630247988994    36.79843746682731    25.48310957683663
17.21554530068682    36.74744889104549    25.828074569244706
14.89966442575134    41.91211042169077    25.670644553730668
11.84271928232701    39.38908478246226    25.352448767215854
11.837440601751714    36.57013809107097    25.898838166181413
14.701190427989157    37.096158830800796    26.05710896984678
13.32760293526184    38.86193510364609    26.57808414390365
18.408557792505093    37.192069047042814    26.0020990672164

Avec 32000 tirages (moyenne de 32000/16 = 2000 ), sur 100 expériences :
      mini                              maxi                      moyenne
24.95245478905833    60.117593098859174    42.78639917424181
25.20168645150558    60.74537019394976    42.38457555442697
23.108440016582687    66.60142641115128    44.27968257289935
23.71971753626084    71.63797875428926    41.83848540928522
23.91390808713624    65.09224224129939    43.594880617477514
23.39871791359518    67.58143236126325    41.37924747397302
23.2405894933842    60.77622890571609    42.60372239105151
20.034345509649174    60.400745028517655    43.57494559669532
19.42292459955503    60.820432422007656    42.7237447443134
22.940139493908923    66.13527802920315    42.93829237895002


J'utilise DevC++  mais il paraît que c'est pas un bon choix...
Avec 16000 tirages, et le code de leon (et srand(time(NULL)) activé) :
min  13.775        17.962      17.762   17.871   13.398
max  28.076       28.853      31.615    28.623   28.561
moy  23.374       22.798      25.136    22.969   23.213

Avec 32000 tirages (et srand(time(NULL)) activé) :
min   12.610    11.253   12.629   12.718   22.458   22.153   11.916
max  19.355    19.342   20.009   19.947   29.466   29.385   19.758
moy  15.781    15.552   15.752   15.794   25.057   25.007   15.611

@+


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#46 22-05-2016 14:53:29

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

yoshi a écrit :

J'ai testé en Python (10 fois) :
Avec 12000 tirages (moyenne de 12000/16 = 750 ), sur 100 expériences :
      mini                              maxi                      moyenne
18.347343131908772    40.09052257080219    26.719777514061807
(...)

Avec 32000 tirages (moyenne de 32000/16 = 2000 ), sur 100 expériences :
      mini                              maxi                      moyenne
24.95245478905833    60.117593098859174    42.78639917424181
(...)

ok, là, ça colle avec la théorie comme tu l'as constaté.

Pour rappel :

Dlzlogic a écrit :

NbTirages = 32000  emq moy=6.868 Min=3.674  Max=10.428
NbTirages = 16000  emq moy=23.356 Min=10.724  Max=39.003
NbTirages = 12000  emq moy=24.286 Min=18.695  Max=28.410

yoshi a écrit :

J'utilise DevC++  mais il paraît que c'est pas un bon choix...
Avec 16000 tirages, et le code de leon (et srand(time(NULL)) activé) :
min  13.775        17.962      17.762   17.871   13.398
max  28.076       28.853      31.615    28.623   28.561
moy  23.374       22.798      25.136    22.969   23.213

Avec 32000 tirages (et srand(time(NULL)) activé) :
min   12.610    11.253   12.629   12.718   22.458   22.153   11.916
max  19.355    19.342   20.009   19.947   29.466   29.385   19.758
moy  15.781    15.552   15.752   15.794   25.057   25.007   15.611

ok, là, ça ne colle plus avec la théorie, comme tu l'as constaté. Sans toutefois retomber vraiment sur les résultats de Dlzlogic, sauf la moyenne à 16000 !

Là, nous sommes tous les trois en train de constater une anomalie (en gras), et en prime une anomalie dans l'anomalie (en rouge) ! Bien joué.

Du coup, une première conclusion qui s'impose d'elle-même : certaines versions de langage ne sont pas propices à de bonnes simulations. C'est évident, mais quand on ne s'en aperçoit pas, alors on fait des simulations fausses de bonne foi, etc. D'où l'intérêt d'avoir un peu de recul théorique pour critiquer des résultats non conformes.

Yoshi, pourquoi dis-tu que "DevC++ n'est pas un bon choix à ce qu'il paraît" ?

Dernière modification par leon1789 (22-05-2016 15:19:45)

Hors ligne

#47 22-05-2016 15:03:20

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Juste pour répondre à tes phrases concernant la combinaison des écarts.
Deux cas différents
1- je mesure une quantité en répétant la même opération plusieurs fois, par exemple mesurer une longueur de 1 km avec une chaine de 20 m. (chaine = ruban d'acier). Si e est l'écart-type d'une mesure (rien à voir avec l'écart systématique), alors l'écart-type sur la mesure totale est e.racine(50).
2- je mesure une même quantité un grand nombre de fois. Exemple typique : mesure GPS. Si e est l'écart-type sur une mesure, alors si on fait 100 mesures (je crois que c'est plutôt de l'ordre de 500, bref), l'écart-type sur le résultat est 2/racine(100).

Oui, il est vrai qu'il y a des résultats parfois un peu inattendus. Je ne sais pas ce que tu appelles "fichier de session". Via mon site tout téléchargement est possible. En C, il y a un source, ce que je t'ai copié et qui à part randomize qui peut être remplacé par srand et l'initialisation du fichier "espion.log" qui doit être rajouté, c'est du code C tout à fait standard. D'autre part, il y le fichier exe qui peut être exécuté sur toute machine qui tourne sous Windows.

En fait l'écart entre 25 et 30 ne me tracasse pas, ça peut dépendre de tellement de choses. Par contre que le sens de variation de l'emq par rapport au nombre de tirages, là ça me dépasse.

Là j'essaye de réfléchir tout haut : On effectue l'opération suivante.
Un certain nombre de fois, on tire à pile ou face 4 pièces. Le résultat multiplié par les puissance de 2 entre 0 et 3 produit un nombre décimal de 0 à 15. On compte le nombre d'occurrences de chacun de ces nombres. La moyenne est le total divisé par 16, parce qu'il y a 16 résultats possibles. Les écarts entre le nombre de chacun des résultats et la moyenne est l'écart observé. C'est là que j'ai fait une erreur dans ma dernière version : je calcule la moyenne observée (moyenne arithmétique) au lieu d'utiliser la moyenne théorique qui est Nb (ex. 16000) divisé par 16. J'en ai profité pour passer en double.
Fin de réflexion.     

Je vais essayer de finir mon code PHP.   

Mais, en ce qui me concerne, le problème principal est que tu considères que l'écart-type varie dans le même sens que le nombre d'observations de la même chose, et surtout que tes simulations le vérifient. Si on prend la formule de Köenig, lorsque n tend vers l'infini, la variance tend vers zéro.

Hors ligne

#48 22-05-2016 15:27:56

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

En fait l'écart entre 25 et 30 ne me tracasse pas, ça peut dépendre de tellement de choses.

On voit bien que javascript, maple, c++, python, "mon C" donne 30, alors que DevC++ et "ton C" donne 23 ou 25.  Aucunes des simulations n passe de 30 à 25 ou de 25 à 30.
Entre 25 et 30, il y a une grosse différence, suffisante à mon avis pour conclure à de mauvaises fonctions random.

Dlzlogic a écrit :

Mais, en ce qui me concerne, le problème principal est que tu considères que l'écart-type varie dans le même sens que le nombre d'observations de la même chose

Je n'ai jamais dit cela... je te dis que le nombre d'observations ne varie pas ! C'est le nombre de variables sommées qui change (12000 ou 16000 ou 32000). Ce que nous observons, c'est la somme \(X_1 + ... + X_{16000} \) pour 16000. Si on augmente à 32000, on n'augmente pas le nombre d'observations, on change d'objet observé car la somme \(X_1 + ... + X_{32000} \)  change en nombre de termes.
D'ailleurs, la moyenne de la somme change 32000 / 16 = 2000, et non 1000 : c'est une preuve qu'on n'observe plus la même chose. :)

Bref, on n'augmente pas le nombre d'observations, mais on change l'objet observé. J'espère être assez limpide.

Dlzlogic a écrit :

Si on prend la formule de Köenig, lorsque n tend vers l'infini, la variance tend vers zéro.

Ok, mais dans le programme, on divise par 16 (toujours par 16) , et par 100 (toujours par 100). Ni 16, ni 100 ne tendent vers l'infini. Donc ce n'est pas un raisonnement ad hoc dans notre cas.

Dlzlogic a écrit :

Je vais essayer de finir mon code PHP.

oui, ce serait intéressant.

Dernière modification par leon1789 (22-05-2016 16:45:37)

Hors ligne

#49 22-05-2016 18:10:47

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : Variable aléatoire at fonction rand()

Bonsoir,
Voila quelques essais avec PHP.
Nb=16000  emqMin=15.439 emqMax=34.130 emqMoy=30.330
Nb=16000  emqMin=18.375 emqMax=27.980 emqMoy=30.574
Nb=8000  emqMin=11.603 emqMax=19.023 emqMoy=21.886
Nb=32000  emqMin=26.863 emqMax=31.397 emqMoy=42.023

Naturellement, ce qui me gène vraiment, c'est que ça correspond exactement aux résultats obtenus avec les autres langages interprétés. A mon avis ce point doit être strictement étudié.
Le PHP est plein de pièges. Petit exemple, la fonction rand ne donne pas les résultats que je pouvais espérer, autrement dit, la valeur renvoyée restait constante pendant toute l'exécution du job. J'ai du utiliser la fonction spéciale mt_rand "Génère une meilleure valeur aléatoire (?)". Demain, je piquerai la fonction du C (j'ai le source), et à mon avis on aura des surprises. 
Bonne soirée.

Hors ligne

#50 22-05-2016 18:50:47

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 947

Re : Variable aléatoire at fonction rand()

Bonsoir,

leon1489 a écrit :

Yoshi, pourquoi dis-tu que "DevC++ n'est pas un bon choix à ce qu'il paraît" ?

D'après developpez.net...
Il y est dit qu'il est buggué et qu'il n'est plus maintenu et qu'il lui faut préférer Code::Blocks par ex...
A noter : DevC++ me refuse le randomize() de Dizlogic, c'est pourquoi j'ai donc remplacé par srand(time(NULL))...

J'ai téléchargé, installé CodeBlocks
Je l'ai lancé...
Trouve pas le compilateur Gcc ! Même en autodétection
J'ai chargé le programme C++ , il fonctionnait...

J'ai chargé ton code C...
Rien à faire : built demandé ! En disant oui, rien ne se passait...
2 h de galère, j'en ai téléchargé des MinGW à installer...
Rien à faire, il ne le trouvait pas, même en indiquant le chemin à la main...

J'ai fini par en trouver un qui fonctionne.
Je voulais voir si les anomalies venaient de DevC++.
Résultats pour 100 répétions de 32000 tirages.
J'ai relancé le prog 10 fois (flemme d'ajouter une boucle)
                               Essais
            -1-        -2-       -3-       -4-        -5-       -6-        -7-       -8-          -9-      -10-
mini    22.500   11.275   22.113   11.325   12.430   11.158   12.475   22.680    11.062    11.429
maxi   29.090   19.590   28.996   19.637   19.468   19.625   20.069   28.725    19.752    19.599
moy   25.067   15.571   25.049   15.463   15.756   15.449   15.712   25.002    15.553     15.540

Apparemment DevC++ n'est pas en cause...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Pied de page des forums