Come genera i valori MathRand()?

 

Per favore, ditemi come MathRand() ottiene i valori.

Possiamo aspettarci che MathRand() sia distribuito uniformemente all'interno dell'intervallo indicato?

 

È stato discusso molte volte sul forum dei quad. Una ricerca sulla parola MathRand dà più di 15 pagine di risultati

Per esempio questi argomenti:

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:

Per favore, ditemi come MathRand() ottiene i valori.

Possiamo aspettarci che MathRand() sia distribuito uniformemente all'interno dell'intervallo indicato?

Penso che si possa fare un test di distribuzione, ma non ricordo come farlo.

L'ho controllato in php qualche tempo fa.

Sembra generare un gran numero di numeri casuali e poi tracciare.

Oppure si può, per esempio, trovare il numero di numeri uguali per una stima approssimativa.

Genera un paio di centinaia di numeri e scrivili in un file, poi fai un grafico con almeno Excel.

 

stringo,

Non ho potuto leggere tutti i link offerti per leggere))

Guardando il numero di post e di partecipanti alla discussione, ho fatto una conclusione:

- MathRand() è sicuro da usare

- Se non avete abbastanza "risoluzione" 0...32767, potete usare MathRand()*MathRand() - la distribuzione non diventerà pesantemente "skewed" in un lato o nell'altro

mrProF,

Una stima approssimativa non è difficile da eseguire

int A[32768] ;

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

A[MathRand()]++;

ma perché?

Per i miei scopi, il commento degli sviluppatori è sufficiente

 
yu-sha:

Per i miei scopi, il commento degli sviluppatori è sufficiente

Gli sviluppatori non hanno sviluppato MathRand da soli, hanno solo implementato la traduzione delle chiamate direttamente alle funzioni CRT srand e rand.

È buono per un uso generale.

 
E se volete fare "wow" allora https://www.mql5.com/ru/forum/123337/page16 il post più in basso.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
gomma da masticare:
E se volete "wow" allora https://www.mql5.com/ru/forum/123337/page16 il post più basso.

Ho bisogno di spostare casualmente i pesi negli algoritmi di logica fuzzy

la cosa principale è non avere un "crollo" costante in una direzione

Grazie per il "wow", naturalmente, ma nel mio caso non è necessario ))

 

su

"- se non c'è abbastanza "risoluzione" 0...32767, si può prendere MathRand()*MathRand(), - la distribuzione non diventerà molto "skewed" da una parte o dall'altra"

Ho sbagliato ...

l'aspettativa si sposterà a sinistra della metà dell'intervallo (sospetto che a 1/4 * 32768^2, ma non sono sicuro di nulla)

in generale, la mia affermazione era sbagliata

 
yu-sha:

su

"- se non c'è abbastanza "risoluzione" 0...32767, si può prendere MathRand()*MathRand(), - la distribuzione non diventerà molto "skewed" da una parte o dall'altra"

Ho sbagliato ...

l'aspettativa si sposterà a sinistra della metà dell'intervallo (sospetto che a 1/4 * 32768^2, ma non sono sicuro di nulla)

In generale, la mia affermazione era sbagliata.

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

Potete usare int o double o ulong invece di long.

 

gomma da masticare,

rstep [0, 2^rstep-1] - non so cosa sia questo parametro

Domanda:

Ho bisogno di cambiare una variabile doppia in modo casuale con una precisione, diciamo, fino all'ottava cifra decimale.

MathRand()/32768 darà un passo di 0,00003 - non abbastanza.

Come ottenere un valore casuale (0...1) uniformemente spaziato a 0.00000001 con MathRand()?

 
yu-sha:

gomma da masticare,

rstep [0, 2^rstep-1] - non ha capito cosa sia questo parametro

Domanda:

Ho bisogno di cambiare una variabile doppia in modo casuale con una precisione, diciamo, fino all'ottava cifra decimale.

MathRand()/32768 darà un passo di 0,00003 - non abbastanza.

Come ottenere un valore casuale uniformemente distribuito a (0...1) con 0.00000001 di discrezione usando MathRand()?


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

Motivazione: