Como é que MathRand() gera valores?

 

Por favor, diga-me como MathRand() obtém valores.

Podemos esperar que MathRand() seja distribuído uniformemente dentro do intervalo indicado?

 

Tem sido discutido muitas vezes no fórum quad. Uma pesquisa na palavra MathRand dá mais de 15 páginas de resultados

Por exemplo, estes tópicos:

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, diga-me como MathRand() obtém valores.

Podemos esperar que MathRand() seja distribuído uniformemente dentro do intervalo indicado?

Acho que podes fazer um teste de distribuição, mas não me lembro como o fazer.

Eu verifiquei-o no PC há algum tempo.

Parece gerar um grande número de números aleatórios, e depois conspirar.

Ou você pode, por exemplo, descobrir o número de números iguais para uma estimativa aproximada.

Gerar algumas centenas de números e escrevê-los em um arquivo, depois grafá-los com pelo menos o Excel.

 

Stringo,

Não consegui ler todos os links oferecidos para ler))

Olhando para o número de postos e participantes na discussão, cheguei a uma conclusão:

- MathRand() é seguro de se usar

- Se você não tiver "resolução" suficiente 0...32767, você pode usar MathRand()*MathRand() - a distribuição não ficará fortemente "enviesada" em um ou outro lado

Sr.ProF,

Uma estimativa aproximada não é difícil de fazer

int A[32768] ;

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

A[MathRand()]++;

mas porquê?

Para os meus propósitos, o comentário dos desenvolvedores é suficiente

 
yu-sha:

Para os meus propósitos, o comentário dos desenvolvedores é suficiente

Os desenvolvedores não desenvolveram MathRand eles mesmos, eles apenas implementaram a tradução de chamadas diretamente para funções CRT srand e rand.

É bom para uso geral.

 
E se você quiser ir "uau", então https://www.mql5.com/ru/forum/123337/page16 o posto mais abaixo.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
pastilha elástica:
E se você quiser "uau" então https://www.mql5.com/ru/forum/123337/page16 o posto mais baixo.

Preciso de mudar aleatoriamente os pesos em algoritmos de lógica fuzzy

o principal é não ter uma "queda" constante em nenhuma direção.

Obrigado pelo "uau", é claro, mas no meu caso é desnecessário ))

 

sobre

"- se não houver "resolução" suficiente 0...32767, você pode levar MathRand()*MathRand(), - a distribuição não ficará muito "enviesada" para um lado ou para o outro".

Eu percebi mal...

a expectativa irá deslocar-se para a esquerda do meio da faixa (suspeito que para 1/4 * 32768^2, mas não tenho a certeza de nada)

em geral, a minha declaração estava errada.

 
yu-sha:

sobre

"- se não houver "resolução" suficiente 0...32767, você pode levar MathRand()*MathRand(), - a distribuição não ficará muito "enviesada" para um lado ou para o outro".

Eu percebi mal...

a expectativa irá deslocar-se para a esquerda do meio da faixa (suspeito que para 1/4 * 32768^2, mas não tenho a certeza de nada)

em geral, a minha declaração estava errada.

hmlo d-range [0, (2^step)-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);
}

Você pode usar int ou duplo ou ulong em vez de longo.

 

pastilha elástica,

rstep [0, 2^rstep-1] - não sei ao certo qual é este parâmetro

Pergunta:

Preciso alterar uma variável dupla aleatoriamente com precisão de, digamos, até a 8ª casa decimal.

MathRand()/32768 dará um passo de 0,00003 - não o suficiente.

Como obter um (0...1) valor aleatório uniformemente espaçado a 0,00000001 com MathRand() ?

 
yu-sha:

pastilha elástica,

rstep [0, 2^rstep-1] - não entendeu o que é este parâmetro

Pergunta:

Preciso alterar uma variável dupla aleatoriamente com precisão de, digamos, até a 8ª casa decimal.

MathRand()/32768 dará um passo de 0,00003 - não o suficiente.

Como obter um valor aleatório uniformemente distribuído em (0...1) com 0,00000001 discrepância usando MathRand() ?


em rsign=1 (-1,1) em 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 é uma licenciatura.

Razão: