¿Cómo genera MathRand() los valores?

 

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

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

 

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.

 

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

 
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.

 
Y si quieres ir "wow", entonces https://www.mql5.com/ru/forum/123337/page16 el puesto de abajo.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
chicle:
Y si quieres "wow" entonces https://www.mql5.com/ru/forum/123337/page16 el puesto más bajo.

Necesito desplazar aleatoriamente los pesos en los algoritmos de lógica difusa

lo principal es no tener un "deslizamiento" constante en una sola dirección

Gracias por el "wow", por supuesto, pero en mi caso es innecesario ))

 

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

 
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.

 

chicle,

rstep [0, 2^rstep-1] - no se sabe 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 (0...1) uniformemente espaciado a 0,00000001 con MathRand() ?

 
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.