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
- www.mql5.com
Veuillez me dire comment MathRand() obtient des valeurs.
Peut-on s'attendre à ce que MathRand() soit distribué uniformément dans l'intervalle indiqué ?
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.
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.
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.
- www.mql5.com
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
à 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.
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() ?
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é.
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Veuillez me dire comment MathRand() obtient des valeurs.
Peut-on s'attendre à ce que MathRand() soit distribué uniformément dans l'intervalle indiqué ?