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

#51 22-05-2016 19:15:46

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

Re : Variable aléatoire at fonction rand()

Ok Yoshi.

Dans tes 10 nouveaux essais, on observe encore une fois des anomalies (valeur moy 15-16) par rapport à la valeur théorique (30-31), et des anomalies (25) dans les anomalies... Cela rend le programme compilé douteux, à mes yeux. Est-ce un problème de version "buggée" ???

Hors ligne

#52 22-05-2016 19:34:50

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

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

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

ça correspond exactement aux résultats obtenus avec les autres langages interprétés

oui et tu remarqueras le rapport \( \simeq \sqrt 2 \) entre emqMoy de 8000 et celui de son double 16000,
et le même rapport entre emqMoy de 16000 et celui de son double 32000.

Dlzlogic a écrit :

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

Oui, je comprends ta remarque, même si hier j'en étais étonné.


On comprend très bien que, mathématiquement, la question du langage informatique n'a pas lieu de poser, puisque les maths ne dépendent pas d'un logiciel informatique. Il ne peut y avoir un bon résultat pour les langages compilés et un autre résultat complètement différent mais bon pour les langages interprétés. En réalité, il n'y a qu'une seule vraie bonne valeur.

Mais en effet, il se peut que des versions "buggées" de logiciels donnent un mauvais rand. "Mon C" (qui compile) donne des résultats conformes à la valeur théorique. Pour ma part, je ne peux expliquer où serait le "bug" dans les langages informatiques, je ne suis pas assez à l'aise dans ces langages C, C++ pour être sûr de moi sur une explication nette sans bavure.

J'aimerais bien mettre la main sur un langage qui ne donne pas une moyenne de l'emq tournant autour de 30 (pour 16000 tirages), histoire d'étudier la situation.

Hors ligne

#53 22-05-2016 20:34:44

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

Re : Variable aléatoire at fonction rand()

Salut,

Python dispose d'un module mathématique rappelant MatLab ou Scilab par les options supplémentaires qu'il offre.
Mais il faut le dl et l'installer, ce que j'ai fait.

Puis j'ai demandé un random entre 0.0 et 1.0 avec une distribution uniforme.
Voilà 10 sorties de 100 fois 16000 tirages :
          min                             max                      moy
18.553975315279473    47.65501022977542     30.507783247807048
17.374550353894055    43.54451745053561     28.851350345850783
18.701604209265042    48.06375973641679     30.48810958708624
11.789826122551595    45.282446930350396   29.453830611769654
18.67819584435285     45.62071897723665     28.965880822985923
16.76305461424021     46.542990879400946   30.22306508140321
15.362291495737216   55.86591089385369     30.630032174422798
20.75451758051726     41.563204881240814   30.375780020811067
19.40038659408621     46.261485060469035   30.3656091439016
18.462800437636755   48.86716689148246     29.759304541111074

Là aussi la moyenne oscille autour de 30, pas de chance ;-).

Par contre 10 séries de 100 fois 32000 tirages :
          min                             max                      moy
28.040149785619906    67.41476099490377    42.98703243037093
27.235087662792644    61.07167919748073    43.3422654690144
24.700708491863143    61.43797685471096    41.93636442133211
25.512251958617842    64.07027391856539    42.586614688763596
23.165167817220752    67.70247410545645    41.64068328508263
25.248762345905195    64.86909896090742    41.769427897968235
23.051572614466025    57.726726912237105   42.25304894462985
23.3746657730116       63.491141114331846   42.6198605259529
26.767517628648346    65.98674109243463     42.40124279638536
25.96391726993444     64.03514659934808     42.40088899973217

Je me demande ce qu'ils entendent exactement par distribution uniforme parce que je peux choisir normale ou d'autres...


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#54 22-05-2016 20:56:19

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

Re : Variable aléatoire at fonction rand()

yoshi a écrit :

Je me demande ce qu'ils entendent exactement par distribution uniforme parce que je peux choisir normale ou d'autres...

Uniforme, Normale, etc. sont des loi de probabilité suivies par le générateur de nombres pseudo aléatoires. Ces choix sont là pour répondre à des simulations particulières.

Dans tous les logiciels, et même par habitude chez les gens, tirer un nombre aléatoirement dans un intervalle se fait par défaut suivant la loi uniforme : tout nombre à la même chance d'être tiré au hasard, ie. la même probabilité. La distribution est uniforme, l'histogramme des valeurs obtenu est une "droite horizontale"...

Il existe d'autres lois où les nombres n'ont pas la même probabilité d'être tiré au hasard, ie l'histogramme des valeurs obtenues par ces lois n'est pas horizontal, mais à une autre forme (en cloche pour la loi normale ou d'autres loi, décroissante pour d'autres lois encore, etc.)

Dernière modification par leon1789 (22-05-2016 20:58:01)

Hors ligne

#55 22-05-2016 20:57:15

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

Re : Variable aléatoire at fonction rand()

Re,

Ok, merci c'est bien ce que je j'avais compris, traduit, mais je me méfie en général des infos en anglais sur les logiciels, toujours peur de mal interpréter...
Et comme c'est la première fois que j'utilise numpy et son jeu d'instructions sur son générateur pseudo aléatoire...

La courbe fournie en exergue est globalement plate, pas en cloche :
http://docs.scipy.org/doc/numpy-1.10.0/ … iform.html
donc ça correspond au type de tirage recherché et les résultats assez fiables...

@+

Dernière modification par yoshi (22-05-2016 21:03:40)


Arx Tarpeia Capitoli proxima...

Hors ligne

#56 22-05-2016 21:01:16

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

Re : Variable aléatoire at fonction rand()

Là, tu as l'histogramme de la loi uniforme.

là c'est une loi "triangulaire" : https://docs.scipy.org/doc/numpy-1.10.0 … gular.html

Là, une loi de Poisson : https://docs.scipy.org/doc/numpy-1.10.0 … isson.html

etc. il y en a des tonnes !

Hors ligne

#57 22-05-2016 21:23:29

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

Re : Variable aléatoire at fonction rand()

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.

Hors ligne

#58 23-05-2016 09:37:02

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

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

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.

non, pas quelle que soit l'expérience, mais quand l'expérience consiste à faire des sommes de variables aléatoires qui suivent des lois ayant des propriétés raisonnables habituelles (liées à l'existence de moyennes et écart-types)

Dlzlogic a écrit :

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.

généralisation incorrecte : il faut faire des sommes...

Dlzlogic a écrit :

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.

oui, c'est effectivement une application directe du TCL quand le nombre d'observations est assez grand. Car quand on comptabilise, on fait une somme de 1 et de 0 pour le dénombrement de chacune des faces. En fait, c'est l'approximation de la loi binomiale par la loi normale.
Et en effet, une trentaine d'observations comme tu dis, c'est le nombre habituel à partir duquel cela se met en pratique en général.

C'est exactement ce que l'on fait dans le programme, mais avec un dé à 16 faces.

Dlzlogic a écrit :

le résultat de la fonction rand dans certains langages interprétés.

Ce serait plutôt le rand de certains langage compilés...

Hors ligne

#59 23-05-2016 11:43:02

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

Re : Variable aléatoire at fonction rand()

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.

Hors ligne

#60 23-05-2016 12:46:42

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

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

Le sujet de validité de tel ou tel générateur me parait important

oui, c'est effectivement très important (et dans le sujet de la discussion), mais je ne suis pas spécialiste des tests de validité de générateurs. Mais bon....

Dlzlogic a écrit :

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 ?

On a  sous les yeux  \( x_1 , ... x_n \)

Une loi normale est déterminée par sa moyenne (ie l'espérance) et son écart-type.

Si on connaît la moyenne par théorie (ou autre justification), alors tant mieux, mais si on ne la connait pas, alors on approche sa valeur par la moyenne arithmétique \(m\) de liste.

Si on connaît l'écart-type par théorie (ou autre justification), alors tant mieux, mais si on le connait pas, alors on approche sa valeur grâce aux éléments de la liste avec la formule \( \frac{1}{n}\sum_{i=1}^n  (x_i - m)^2 \) (=écart-type de la liste) si m est la vraie valeur de l'espérance de la loi, et avec la formule \( \frac{1}{n-1}\sum_{i=1}^n  (x_i - m)^2 \) si m n'est qu'une valeur approchée de l'espérance de la loi. Disons qu'on a obtenu la valeur \(s\) par un moyen ou un autre.

Ainsi, on obtient deux  valeurs m et s qui se veulent être (proche de) l'espérance et l'écart-type de la loi normale.
Il reste maintenant à vérifier que \( x_1 , ... x_n \) est conforme à la loi N(m,s). Là, on peut comparer la fonction de masse de la loi N(m,s), à savoir \( \frac{1}{s.\sqrt{2 \pi}}\exp(\frac{-1}{2}(\frac{x-m}{s})^2) \),  et un histogramme de fréquences de  \( x_1 , ... x_n \) (par exemple avec 10 classes comme tu le fais, mais si n est assez grand, on peut augmenter le nombre de classes pour être plus précis).

Hors ligne

#61 23-05-2016 13:41:29

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

Re : Variable aléatoire at fonction rand()

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.

Hors ligne

#62 23-05-2016 15:01:59

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

Re : Variable aléatoire at fonction rand()

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.

Hors ligne

#63 23-05-2016 15:53:20

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

Re : Variable aléatoire at fonction rand()

Bonjour,

Si je peux me permettre d'interrompre les spécialistes, il semblerait que pour évaluer un RNG, il existe une batterie de tests surnommée "Diehard" :
https://en.wikipedia.org/wiki/Diehard_tests
http://stat.fsu.edu/pub/diehard/

Le site statsoft s'enorgueillit de ce que "Les générateurs de nombres aléatoires de STATISTICA ont été certifiés en utilisant la batterie de tests DIEHARD, et ont franchi tous les critères de test."
cf : http://www.statsoft.fr/concepts-statist … terie.html

Bonne lecture...

Quant au débat sur langage interprété vs compilé il me semble oiseux.
Python est interprété, pourtant il, existe des softs permettant de réaliser des programmes standalone (d'accord ce n'est pas de la compilation stricto sensu) mais en d'autres occasions entre le prog de base et sa version standalone je n'ai jamais vu de différence de comportement. Normal, puisque ces softs empaquètent l'interpréteur complet et les éventuels modules additionnels importés dans un exécutable.
Je pense que tout vient du RNG lui-même et/ou de la façon de s'en servir...

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#64 23-05-2016 16:05:33

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

Re : Variable aléatoire at fonction rand()

Dlzlogic a écrit :

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

Tu obtiens ces résultats avec PHP, c'est bien ça ? J'espère que oui, car tu pourrais nous donner le source pour le mettre sur le web. Ainsi je pourrais étudier la situation, comme chacun d'entre nous.

Dernière modification par leon1789 (23-05-2016 16:19:15)

Hors ligne

#65 23-05-2016 16:10:16

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

Re : Variable aléatoire at fonction rand()

Merci Yoshi pour tes liens.

yoshi a écrit :

Quant au débat sur langage interprété vs compilé il me semble oiseux.

Du point de vue mathématique, tu as bien raison. C'est aussi ce que je me suis dit la première fois que Dlzlogic en a parlé.
Mais ensuite m'est venue l'idée de la compilation : avec quoi compile-t-on ? une version "buggée" d'un RNG ? Je ne sais pas...
J'espère maintenant que Dlzlogic a obtenu ses derniers tests avec PHP et qu'il va nous donner le code pour que nous puissions analyser.

Dernière modification par leon1789 (23-05-2016 16:14:20)

Hors ligne

#66 23-05-2016 16:16:40

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

Re : Variable aléatoire at fonction rand()

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>

Hors ligne

#67 23-05-2016 17:35:47

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

Re : Variable aléatoire at fonction rand()

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 ?

Dernière modification par leon1789 (23-05-2016 18:01:54)

Hors ligne

#68 23-05-2016 18:00:18

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

Re : Variable aléatoire at fonction rand()

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.

Hors ligne

#69 23-05-2016 18:02:24

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

Re : Variable aléatoire at fonction rand()

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

?!

Dernière modification par leon1789 (23-05-2016 18:08:01)

Hors ligne

#70 23-05-2016 18:14:59

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

Re : Variable aléatoire at fonction rand()

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 ?

Hors ligne

#71 23-05-2016 18:35:58

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

Re : Variable aléatoire at fonction rand()

Salut,

Mais ensuite m'est venue l'idée de la compilation : avec quoi compile-t-on ? une version "buggée" d'un RNG ?

Pour moi, il n'y a pas de RNG dans un compilateur (je peux me tromper, bien sûr). Pour quoi faire ?
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.
Python est libre (et gratuit, c'est pas synonyme) C++ est libre (je crois), C doit être propriétaire...

https://fr.wikipedia.org/wiki/Compilateur a écrit :

Les étapes de la compilation incluent :
  * Le prétraitement, nécessaire pour certains langages comme C, qui prend en charge la substitution de macro et de la compilation conditionnelle.
    Généralement, la phase de prétraitement se produit avant l'analyse syntaxique ou sémantique ; par exemple dans le cas de C, le préprocesseur manipule les symboles lexicaux plutôt que des formes syntaxiques.

* L'analyse lexicale, qui découpe le code source en petits morceaux appelés jetons (tokens).
    Chaque jeton est une unité atomique unique de la langue (unités lexicales ou lexèmes), par exemple un mot-clé, un identifiant ou un symbole. La syntaxe de jeton est généralement un langage régulier, donc reconnaissable par un automate à états finis.
    Cette phase est aussi appelée à balayage ou lexing ; le logiciel qui effectue une analyse lexicale est appelé un analyseur lexical ou un scanner. Un analyseur lexical pour un langage régulier peut être généré par un programme informatique, à partir d'une description du langage par des expressions régulières. Deux générateurs classiques sont lex et flex.

  * L'analyse syntaxique implique l'analyse de la séquence jeton pour identifier la structure syntaxique du programme.
    Cette phase s'appuie généralement sur la construction d'un arbre d'analyse ; on remplace la séquence linéaire des jetons par une structure en arbre construite selon la grammaire formelle qui définit la syntaxe du langage. Par exemple, une condition est toujours suivie d'un test logique (égalité, comparaison…). L'arbre d'analyse est souvent modifié et amélioré au fur et à mesure de la compilation. Yacc et GNU Bison sont les analyseurs syntaxiques les plus utilisés.

  * L'analyse sémantique est la phase durant laquelle le compilateur ajoute des informations sémantiques à l'arbre d'analyse et construit la table des symboles.
    Cette phase vérifie le type (vérification des erreurs de type), ou l'objet de liaison (associant variables et références de fonction avec leurs définitions), ou une tâche définie (toutes les variables locales doivent être initialisées avant utilisation), peut émettre des avertissements, ou rejeter des programmes incorrects.
    L'analyse sémantique nécessite habituellement un arbre d'analyse complet, ce qui signifie que cette phase fait suite à la phase d'analyse syntaxique, et précède logiquement la phase de génération de code ; mais il est possible de replier ces phases en une seule passe.

  * La transformation du code source en code intermédiaire ;

   * L'application de techniques d'optimisation sur le code intermédiaire : c'est-à-dire rendre le programme « meilleur » selon son usage (voir infra).

  * La génération de code avec l'allocation de registres et la traduction du code intermédiaire en code objet, avec éventuellement l'insertion de données de débogage et d'analyse de l'exécution ;
 
  * Et finalement l'édition des liens.

L'analyse lexicale, syntaxique et sémantique, le passage par un langage intermédiaire et l'optimisation forment la partie frontale. La génération de code et l'édition de liens constituent la partie finale.

Ces différentes étapes font que les compilateurs sont toujours l'objet de recherches.

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 ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#72 23-05-2016 19:01:59

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

Re : Variable aléatoire at fonction rand()

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.

Hors ligne

#73 23-05-2016 19:08:35

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

Re : Variable aléatoire at fonction rand()

Re,

Et si le nœud du pb gitait dans le processeur ?
Parce qu'en dernier ressort, le compilateur s'adresse au processeur...
Sur ma bécane j'ai un AMD FX 6300 6 cœurs.
Quel est le type de ton processeur ? celui de Dizlogic ?

Ou alors dans l'OS ? Je suis encore sous Win XP, mais j'ai aussi un un portable avec Win 7, je testerai.
Quelqu'un utilise-t-il Linux ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#74 23-05-2016 20:03:50

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

Re : Variable aléatoire at fonction rand()

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

Hors ligne

#75 23-05-2016 20:18:34

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

Re : Variable aléatoire at fonction rand()

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

Hors ligne

Pied de page des forums