¿Cómo genera MathRand() los valores?

yu-sha  

Por favor, dime cómo MathRand() obtiene los valores.

¿Podemos esperar que MathRand() se distribuya uniformemente dentro del rango establecido?

Slava  

Se ha discutido muchas veces en el foro de quad. Una búsqueda de la palabra MathRand da más de 15 páginas de resultados

Por ejemplo, estos temas:

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:

Por favor, dime cómo MathRand() obtiene los valores.

¿Podemos esperar que MathRand() se distribuya uniformemente dentro del rango establecido?

Creo que se puede hacer una prueba de distribución, pero no recuerdo cómo se hace.

Lo comprobé en php hace tiempo.

Parece que genera un gran número de números aleatorios y luego los traza.

O se puede, por ejemplo, averiguar la cantidad de números iguales para una estimación aproximada.

Genera un par de cientos de números y escríbelos en un archivo, luego haz un gráfico con al menos Excel.

yu-sha  

estrangulamiento,

No pude leer todos los enlaces ofrecidos para leer))

Observando el número de mensajes y de participantes en el debate, llegué a una conclusión:

- MathRand() es seguro de usar

- Si no tiene suficiente "resolución" 0...32767, puede utilizar MathRand()*MathRand() - la distribución no se volverá muy "sesgada" en uno u otro lado

mrProF,

Una estimación aproximada no es difícil de realizar

int A[32768] ;

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

A[MathRand()]++;

¿pero por qué?

Para mis propósitos, el comentario de los desarrolladores es suficiente

Slava  
yu-sha:

Para mis propósitos, el comentario de los desarrolladores es suficiente

Los desarrolladores no desarrollaron MathRand ellos mismos, sólo implementaron la traducción de las llamadas directamente a las funciones CRT srand y rand.

Es bueno para el uso general.

gumgum  
yu-sha:

sobre

"- si no hay suficiente "resolución" 0...32767, puedes tomar MathRand()*MathRand(), - la distribución no se volverá muy "sesgada" hacia un lado u otro"

Me equivoqué...

la expectativa se desplazará a la izquierda del centro del rango (sospecho que a 1/4 * 32768^2, pero no estoy seguro de nada)

en general, mi afirmación era errónea.

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);
}

Puedes utilizar int o double o ulong en lugar de long.

gumgum  
yu-sha:

chicle,

rstep [0, 2^rstep-1] - no se entiende qué es este parámetro

Pregunta:

Necesito cambiar una variable doble de forma aleatoria con una precisión de, por ejemplo, hasta el octavo decimal.

MathRand()/32768 dará un paso de 0,00003 - no es suficiente.

¿Cómo obtener un valor aleatorio uniformemente distribuido en (0...1) con una discreción de 0,00000001 utilizando MathRand() ?


en rsign=1 (-1,1) en 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 es un grado.

Razón de la queja: