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
- www.mql5.com
Por favor, diga-me como MathRand() obtém valores.
Podemos esperar que MathRand() seja distribuído uniformemente dentro do intervalo indicado?
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.
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
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
- www.mql5.com
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.
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.
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() ?
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.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Por favor, diga-me como MathRand() obtém valores.
Podemos esperar que MathRand() seja distribuído uniformemente dentro do intervalo indicado?