Comment MathRand() génère-t-il des valeurs ?

 

Veuillez me dire comment MathRand() obtient des valeurs.

Peut-on s'attendre à ce que MathRand() soit distribué uniformément dans l'intervalle indiqué ?

 

Cela a été discuté à de nombreuses reprises sur le forum quad. Une recherche sur le mot MathRand donne plus de 15 pages de résultats.

Par exemple, ces sujets :

https://www.mql5.com/ru/forum/123337

https://www.mql5.com/ru/forum/111855

https://www.mql5.com/ru/forum/111974

https://www.mql5.com/ru/forum/125667

Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
yu-sha:

Veuillez me dire comment MathRand() obtient des valeurs.

Peut-on s'attendre à ce que MathRand() soit distribué uniformément dans l'intervalle indiqué ?

Je pense que vous pouvez faire un test de distribution, mais je ne me souviens pas comment le faire.

Je l'ai vérifié en php il y a quelques temps.

Il semble générer un grand nombre de nombres aléatoires, puis les tracer.

Ou on peut, par exemple, trouver le nombre de nombres égaux pour une estimation approximative.

Générer quelques centaines de chiffres et les écrire dans un fichier, puis les représenter graphiquement avec au moins Excel.

 

stringo,

Je n'ai pas pu lire tous les liens proposés pour lire))

En regardant le nombre de messages et de participants à la discussion, j'ai tiré une conclusion :

- MathRand() est sûr à utiliser

- Si vous n'avez pas assez de "résolution" 0...32767, vous pouvez utiliser MathRand()*MathRand() - la distribution ne sera pas fortement "asymétrique" d'un côté ou de l'autre.

mrProF,

Une estimation approximative n'est pas difficile à réaliser

int A[32768] ;

for (int i=0 ; i<1000000 ; i++)

A[MathRand()]++ ;

mais pourquoi ?

Pour moi, le commentaire des développeurs est suffisant.

 
yu-sha:

Pour mes besoins, le commentaire des développeurs est suffisant.

Les développeurs n'ont pas développé MathRand eux-mêmes, ils ont juste implémenté la traduction des appels directs aux fonctions CRT srand et rand.

C'est bon pour un usage général.

 
Et si vous voulez faire "wow", alors https://www.mql5.com/ru/forum/123337/page16 le tout dernier message.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
gumgum:
Et si vous voulez du "wow", alors https://www.mql5.com/ru/forum/123337/page16 le poste le plus bas.

J'ai besoin de changer aléatoirement les poids dans les algorithmes de logique floue.

l'essentiel est de ne pas avoir un "marasme" constant dans une direction ou une autre

Merci pour le "wow", bien sûr, mais dans mon cas, c'est inutile ;))

 

à propos de

"- s'il n'y a pas assez de "résolution" 0...32767, vous pouvez prendre MathRand()*MathRand(), - la distribution ne deviendra pas très "asymétrique" d'un côté ou de l'autre"

Je me suis trompé...

l'espérance se décalera vers la gauche du milieu de l'intervalle (je soupçonne que c'est 1/4 * 32768^2, mais je ne suis sûr de rien)

en général, ma déclaration était fausse

 
yu-sha:

à propos de

"- s'il n'y a pas assez de "résolution" 0...32767, vous pouvez prendre MathRand()*MathRand(), - la distribution ne deviendra pas très "asymétrique" d'un côté ou de l'autre"

Je me suis trompé...

l'espérance se décalera vers la gauche du milieu de l'intervalle (je soupçonne que c'est 1/4 * 32768^2, mais je ne suis sûr de rien)

en général, ma déclaration était fausse.

hmlo d-range [0, (2^rstep)-1]

long ranD(int rstep)
{
long div=1;
long r=0; 
   for(int i=1;i<=rstep;i++)
   {
   if(MathRand()+1>16383.5){if(i==1){r=1;}else{r+=div;}}
   div=div*2;
   }
return(r);
}

Vous pouvez utiliser int ou double ou ulong au lieu de long.

 

gumgum,

rstep [0, 2^rstep-1] - Je ne suis pas sûr de la signification de ce paramètre.

Question :

J'ai besoin de modifier une variable double de manière aléatoire avec une précision de, disons, jusqu'à la huitième décimale.

MathRand()/32768 donnera un pas de 0,00003 - pas assez.

Comment obtenir une valeur aléatoire (0...1) régulièrement espacée à 0.00000001 avec MathRand() ?

 
yu-sha:

gumgum,

rstep [0, 2^rstep-1] - n'a pas compris ce qu'est ce paramètre

Question :

J'ai besoin de modifier une variable double de manière aléatoire avec une précision de, disons, jusqu'à la huitième décimale.

MathRand()/32768 donnera un pas de 0,00003 - pas assez.

Comment obtenir une valeur aléatoire uniformément distribuée à (0...1) avec une discrétisation de 0.00000001 en utilisant MathRand() ?


à rsign=1 (-1,1) à rsign=0 (0,1)

double ranD(int rsign,int rstep)
{
double div=2;
double r=0; 
   for(int i=1;i<=rstep;i++)
   {
   if(MathRand()+1>16383.5){r+=1/div;}
   div=div*2;   
   }
      if(rsign==1)
         {
         r=2*r-1;
         }
return(r);
}

rstep est un degré.

Raison: