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 15:42:16

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.
Exemple, il y a quelque années, Doraki a accepté de faire une expérience : un dé (à jouer ordinaire), lancé une trentaine de fois vérifie la répartition normale des écarts à la moyenne. Comme il n'y avait que 6 faces, on s'est limité à 4 classes.
En vertu de la loi des grands nombres et conformément à l'expérience, la moyenne est obtenue assez rapidement (cf application de Monte-Carlo).
Donc que tu fasse 30 essais (et non 20 comme écrit par ailleurs) donnera presque le même résultat qu'avec 16000. Les probabilités n'ont pas beaucoup de relations avec les proportions.

Tiens, à propos des 16000 jets de dé, si les 16 premiers tombaient sur 1, le résultat ne s'en ressentirait pas, et pourtant c'est impossible.

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

Si tu veux faire des essais significatifs, utilise plutôt cela.
Que tu utilise 16000 ou 20, c'est pas tr-s différent. Ce que tu observes, c'est la répartition des 16 faces. D'ailleurs, c'est le première réaction que tu as eue.


int main()  // suivant 188
{
  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;
/* le principe est de faire 10 successifs, de cumuler les résultats
et à chaque étape calculer l'emq
*/
  for (int jeu=0; jeu < 10; jeu++)
  {
    for (int 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]++ ;
    }
    double Moy=100. + 100.*jeu;
    double Var=0;
    for (int j=0; j<100; j++)
    {
      double diff = Moy-Res[j];
      Var+=diff*diff;
    }
    double Emq=sqrt(Var/Moy);
    fprintf(espion,"Jeu=%d Moy=%0.2f Emq=%0.2f\n",jeu,Moy,Emq);
  }
//  for (int i=0; i<100; i++)
//    fprintf(espion,"%d\n",Res[i]) ;
//  system("pause");    //getch();
  return 0 ;
}
 

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

Bonjour,
Si c'est le source de rand dont tu as besoin pour que Gérard te donne son avis, alors voilà :


/*-----------------------------------------------------------------------*
 * filename - rand.c
 *
 * function(s)
 *        srand - initializes random number generator
 *        rand  - random number generator
 *-----------------------------------------------------------------------*/

/*
 *      C/C++ Run Time Library - Version 11.0
 *
 *      Copyright (c) 1987, 2002 by Borland Software Corporation
 *      All Rights Reserved.
 *
 */

/* $Revision: 9.6 $        */

#pragma inline

#ifdef _MT
#include <_thread.h>
#endif
#include <stdlib.h>

#define MULTIPLIER      0x015a4e35L
#define INCREMENT       1

#if !defined(_SEED_T)
#define _SEED_T
typedef struct
{
    unsigned lo;
    unsigned hi;
} __seed_t;
#endif

#ifdef _MT
#define Seed _thread_data()->thread_seed
#else
static  __seed_t  Seed = { 1, 0 };
#endif

/*---------------------------------------------------------------------*

Name            srand - initializes random number generator

Usage           void srand(unsigned seed);

Prototype in    stdlib.h

Description     see rand below

Return value    Nothing

*---------------------------------------------------------------------*/

void _RTLENTRY _EXPFUNC srand(unsigned seed)
{
        Seed.lo = seed;
        Seed.hi = 0;
        rand();    // primes the seed by using the first number which
                   // is usually not as random as the subsequent numbers
                   // are.
}

static void boot_srand(void)
{
#pragma startup boot_srand 10 /* Initializes the random seed */
    srand(1);
}


/*---------------------------------------------------------------------*

Name            rand - random number generator

Usage           int rand(void);

Related
functions usage void srand(unsigned seed);

Prototype in    stdlib.h

Description     rand uses a multiplicative congruential random number
                generator with period 2^32 to return successive pseudo-
                random numbers in the range from 0 to 2^15 - 1.

                The generator is reinitialized by calling srand with an
                argument value of 1. It can be set to a new starting point by
                calling srand with a given seed number.

*---------------------------------------------------------------------*/

int _RTLENTRY _EXPFUNC rand(void)
{
        Seed.lo = MULTIPLIER * Seed.lo + INCREMENT;
        return((int)(Seed.lo >> 16) & 0x7fff);
}

/*---------------------------------------------------------------------*

Name            _lrand - long random number generator

Usage           long _lrand(void);

Related
functions usage void srand(unsigned seed);
                int rand(void);

Prototype in    stdlib.h

Description     _rand uses a multiplicative congruential random number
                generator with period 2^64 to return successive pseudo-
                random numbers in the range from 0 to 2^31 - 1.

                The generator is reinitialized by calling srand with an
                argument value of 1. It can be set to a new starting point by
                calling srand with a given seed number.

*---------------------------------------------------------------------*/

long _RTLENTRY _EXPFUNC _lrand(void)
{
//      Seed = MULTIPLIER * Seed + INCREMENT;
//      return((int)(Seed & 0x7fffffffL));

    _EBX = Seed.hi;            /* use EBX so MT Seed call preserves */
    _ESI = Seed.lo;

    asm    mov    eax, ebx
    asm    mov    ecx, 015Ah
    asm    mov    ebx, 4E35h


    asm    test    eax, eax
    asm    jz    nohi1
    asm    mul    ebx        

nohi1:
    asm    xchg    ecx, eax        
    asm    mul    esi
    asm    add    eax, ecx
           
    asm    xchg    eax, esi
    asm    mul    ebx
    asm    add    edx, esi
           
    asm    add    eax, 1
    asm    adc    edx, 0
    asm    mov    ebx, eax    /* use EBX so MT Seed call preserves */
    asm    mov    esi, edx    /* use ESI so MT Seed call preserves */
           
    Seed.lo = _EBX;
    Seed.hi = _ESI;
    return _ESI & 0x7fffffff;
}
 

Par ailleurs, je me demande si le résultat que tu as montré n'est pas plutôt celui que j'ai obtenu en PHP.
De mémoire, dans une vieille discussion tu te demandais d'où venait la limite de 30 valeurs lues pour une même chose. Là, tu en utilises 16, c'est un peu mesquin.

#379 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 18:39:22

Je veux bien continuer à condition de définir et de fixer le protocole.
Donc, la balle est dans ton camp. De toute façon, il faut au moins un dé à 100 faces.

#380 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 17:23:55

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.

#381 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 15:06:56

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 ?

#382 Re : Café mathématique » Variable aléatoire at fonction rand() » 25-05-2016 13:47:11

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éon a écrit :

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.

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

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.

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

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

#385 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 18:13:19

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

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

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 main()  // suivant 188
{
  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.21

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

#387 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 16:52:20

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

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

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

Classe 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%     |

#389 Re : Café mathématique » Variable aléatoire at fonction rand() » 24-05-2016 13:20:56

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

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

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

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

#390 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 21:06:35

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.

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

Oui, tu peux le demander.
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.
Il est bien évident que je ne tire aucune conclusion de ces essais. La fonction PHP est beaucoup trop lente pour tester quoi que ce soit. Et d'autre part, je n'ai pas le code de rand (ou mt_rand) de PHP, ni même un mot d'explication.
Il y a deux manières de tester une fonction, soit on examine le code, soit on fait de très nombreux essais.
Pour moi, fin de discussion.

#392 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 16:16:40

Voila le code PHP
<html>
<head>
<title>Test de générateur</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<BODY  LINK=gold VLINK=gold alink=snow text=gold bgcolor="#055090">


<?php
//---------------------------------------------------------------------------
  $FicEcr=fopen("G:\\BC++B6\\Console\\TestRand.txt","at");
  if ($FicEcr == NULL)
  {
    echo("Le fichier n'existe pas\n");
    return;
  }
  $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>");
  fprintf($FicEcr,"Initialusation Seed_lo=%d\n",$Seed_lo);
  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);
  }
//  mt_srand((double)microtime()*1000000);
  echo("Début du traitement  RAND_MAX= ".getrandmax()."\n<br>");
//  fprintf($FicEcr,"Début du traitement  RAND_MAX=%d\n",getrandmax());
  $Nb=12000; //000;
  $Memq=0.0;
  $emqMin=10000.0;
  $emqMax=0.0;
  $NbFois=100;  // à terme = 100
  for ( $fois=0; $fois < $NbFois; $fois++)
  {
// on réalise $NbFois fois l'expérience suivante
//    int Res[16];
    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=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]++;
/*
if ($i < 20)
{
//sprintf("a=%d b=%d c=%d d=%d r=%d\n<br/>",$a, $b, $c, $d, $r);
fprintf($FicEcr,"a=%d b=%d c=%d d=%d r=%d\n",$a, $b, $c, $d, $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;
// impression de l'emq dans un fichier texte
//    sprintf("emq=%0.3f \n<br/>",$emq);
//    fprintf($FicEcr,"%0.3f\n",$emq);
//    for ($i=0; $i<16; $i++) fprintf($FicEcr,"%d\n",$Res[$i]);
  }
  $Memq/=$NbFois;  //100.0;
  fprintf($FicEcr,"Nb=%d  emqMin=%0.3f emqMax=%0.3f emqMoy=%0.3f\n",
             $Nb,$emqMin,$emqMax,$Memq);
  return;
?>
</body>
</html>

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

Voila mes derniers essais (je sais qu'il y a une faute (corrigée) dans le calcul du max, mais c'est la moyenne qui est importante).
Les essais suivant sont faits avec la fonction dlz_rand inspirée de rand() de Borland la graine est initialisée à 1111
Nb=16000  emqMin=31.415 emqMax=40.044 emqMoy=38.937
Graine initialisée avec l'horloge
Initialusation Seed_lo=875001
Nb=16000  emqMin=13.276 emqMax=28.191 emqMoy=23.562
Initialusation Seed_lo=906251
Nb=16000  emqMin=13.481 emqMax=24.503 emqMoy=23.403
Initialusation Seed_lo=62
Nb=16000  emqMin=14.182 emqMax=19.095 emqMoy=23.448
Initialusation Seed_lo=859
Nb=16000  emqMin=12.971 emqMax=32.825 emqMoy=23.525
Initialusation Seed_lo=281
Nb=8000  emqMin=17.875 emqMax=30.943 emqMoy=23.753
Initialusation Seed_lo=812
Nb=32000  emqMin=22.872 emqMax=44.359 emqMoy=35.205
Initialusation Seed_lo=359
Nb=32000  emqMin=24.395 emqMax=44.569 emqMoy=35.154
Initialusation Seed_lo=343
Nb=12000  emqMin=12.520 emqMax=32.037 emqMoy=22.188


Voila mes résultats, mais je n'ai pas d'avis.

#394 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 13:41:29

Oui, ce que indiques, ce sont des définitions (moyenne et écart-type). Il existe pas mal de "test de normalité". Le mien (10 classes) tu le connais, puisque je l'utilise régulièrement. L'appréciation est visuelle. Par exemple une symétrie parfaite est suspecte, ainsi qu'une dissymétrie importante. Le test ema/emq (conseillé pas Paul Lévy) me parait intéressant.
Le PHP a été fait pour créer des pages HTML, il est pas vraiment fait pour des simulations. Donc je rame.

#395 Re : Café mathématique » Variable aléatoire at fonction rand() » 23-05-2016 11:43:02

Bonjour Léon,
Pour éviter un dialogue de sourds et surtout pour revenir au sujet principal, pourrais-tu proposer un test de "normalité". En d'autres termes, par un moyen donné, on a créé une série de nombre sous forme de liste, comment vérifier si cette série est conforme à la loi normale ?

Je distingue volontairement les termes liste et série. Une liste est souvent sous-entendue ordonnée, contrairement pour une série.

Tu pourras regarder le PDF http://www.dlzlogic.com/aides/Boules.pdf

Le sujet de validité de tel ou tel générateur me parait important, je pense par exemple à l'utilisation de la méthode de Monte-Carlo.

#396 Re : Café mathématique » Variable aléatoire at fonction rand() » 22-05-2016 21:23:29

Bonsoir,
Il me semble que le TCL est très clair, et celà correspond exactement à ce que j'ai toujours su, quelle que soit l'expérience, la répartition des écarts à la moyenne est conforme à la loi normale.
Autrement, il peut y avoir des quantités de lois expérimentales, la plus connue est la loi de probabilité égale (loi uniforme), la répartition des écarts à la moyenne est conforme à la loi normale.
L'exemple simple que j'ai déjà cité, on lance un dés à 6 faces ordinaire une trentaine de fois. Chaque face a une chance sur 6 d'apparaitre. On comptabilise le nombre de sorties de chaque face. On constate facilement la répartition normale. Et ça on n'y peut rien, c'est toujours comme ça.
Mais à mon avis, on diverge du sujet initiale, le résultat de la fonction rand dans certains langages interprétés.

#397 Re : Café mathématique » Variable aléatoire at fonction rand() » 22-05-2016 18:10:47

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.

#398 Re : Café mathématique » Variable aléatoire at fonction rand() » 22-05-2016 15:03:20

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.

#399 Re : Café mathématique » Variable aléatoire at fonction rand() » 22-05-2016 12:28:46

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.

#400 Re : Café mathématique » Variable aléatoire at fonction rand() » 21-05-2016 22:38:32

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.

Pied de page des forums