MathRand()はどのように値を生成するのですか?

 

MathRand()が 値を取得する方法を教えてください。

MathRand()は、記載された範囲内で均等になることを期待できるのでしょうか?

 

クアッドフォーラムで何度も議論されてきたことです。MathRandという単語で検索すると、15ページ以上の結果が表示される

例えばこんなトピックがあります。

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 さん。

MathRand()が値を取得する方法を教えてください。

MathRand()は、記載された範囲内で均等になることを期待できるのでしょうか?

分布テストができると思うのですが、やり方が思い出せません。

少し前にphpで確認しました。

乱数を大量に生成してプロットしているようです。

また、例えば、大まかな見積もりとして、等しい数の数を求めることもできます。

数百個の数値を生成してファイルに書き出し、最低でもExcelでグラフ化する。

 

ストリングス

提供されたリンク先を全て読むことができませんでした))

投稿数と議論への参加者数を見て、私はある結論を出した。

- MathRand()の使用は安全です。

- 0〜32767の十分な「解像度」がない場合は、MathRand()*MathRand()を使用することができます - 分布がどちらかに大きく「偏る」ことはありません。

mrProF です。

概算を行うことは難しくありません

int A[32768] ;

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

A[MathRand()]++;

が、なぜ?

私の目的には、開発者のコメントで十分です

 
yu-sha:

私の目的には、開発者のコメントで十分です。

開発者が自らMathRandを 開発したわけではなく、CRTの関数srandとrandを直接呼び出す翻訳を実装しただけです。

一般的な使用には適している。

 
そして、もしあなたが「すごい」と思いたいなら、https://www.mql5.com/ru/forum/123337/page16 一番下の投稿をご覧ください。
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
ガムガム
そして、「すごい」を求めるのであれば、https://www.mql5.com/ru/forum/123337/page16 一番下のポスト。

ファジィーロジックアルゴリズムで重みをランダムに移動させたい

かたよりがち

もちろん、"すごい "はありがたいのですが、私の場合、不要です ))

 

凡そ

"-もし十分な「解像度」が0...32767 でなければ、 MathRand()*MathRand()取ることができます、-分布はどちらかに非常に「偏った」ものになる ことはありません。"

間違えました.

期待値が中央より左にシフトする(1/4 * 32768^2 と思われるが、何も確信が持てない)。

一般論として、私の発言は間違っています。

 
yu-sha さん。

凡そ

"-もし十分な「解像度」が0...32767でなければ、MathRand()*MathRand()を取ることができます、-分布はどちらかに非常に「偏った」ものになる ことはありません。"

間違えました.

期待値が中央より左にシフトする(1/4 * 32768^2 と思われるが、何も確信が持てない)。

一般的に、私の発言は間違っていました。

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

longの代わりにintやdouble、ulongを使用することができます。

 

ガムガム

rstep [0, 2^rstep-1] - このパラメータが何であるかは不明です。

質問です。

double変数をランダムに、例えば小数点以下8桁までの精度で変更する必要があります。

MathRand()/32768では、0.00003のステップとなり、十分ではありません。

MathRand() で 0.00000001 の等間隔な乱数値を得るには?

 
yu-sha さん。

ガムガム

rstep [0, 2^rstep-1] - このパラメータが何であるかは理解していない。

質問です。

double変数をランダムに、例えば小数点以下8桁までの精度で変更する必要があります。

MathRand()/32768では、0.00003のステップとなり、十分ではありません。

MathRand() を用いて、0.00000001 の離散度で (0...1) に一様分布する乱数値を得るには?


at rsign=1 (-1,1) at 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は度数です。

理由: