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绘制图表。

 

stringo

无法阅读提供的所有链接))。

看了看帖子的数量和讨论的参与者,我做了一个结论。

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

你可以用int或double或ulong来代替long。

 

胶水

rstep [0, 2^rstep-1] - 不确定这个参数是什么

问题。

我需要随机地改变一个双倍变量,准确度可以达到小数点后第8位。

MathRand()/32768将给出一个0.00003的步长--不够。

如何用MathRand()获得0.00000001的(0...1)均匀间隔的随机值?

 
yu-sha:

胶水

rstep [0, 2^rstep-1] - 我不明白这个参数是什么。

问题。

我需要随机地改变一个双倍变量,准确度可以达到小数点后第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是一个程度。