我在确定Mersenne Twister C ++ 11提供的变体时遇到麻烦。在Mersenne twister上的Matsumoto和Nishimura的ACM论文中:作者:623维均匀分布的伪随机数生成器,作者提供了该算法,该算法的实现,并将其称为MT19937
。
但是,当我使用下面的小程序测试C ++ 11的同名生成器时,我无法再现由Matsumoto和Nishimura的MT19937创建的流。流与产生的第一个32位字不同。
C ++ 11提供哪些Mersenne Twister?
下面的程序使用GCC-std=c++11
和GNU在Fedora 22上运行stdlibc++
。
std::mt19937 prng(102013);
for (unsigned int i = 0; i <= 625; i++)
{
cout << std::hex << prng();
if(i+1 != 625)
cout << ",";
if(i && i%8 == 0)
cout << endl;
}
从纸张链接和标准定义的MT19937来看MT19937看起来是一样的,但是又增加了一层回火和初始化倍增器
如果我们看一下[rand.predef] 26.5.5(3)定义的值与本文定义的参数,
32,624,397,31,0x9908b0df,11,0xffffffff,7,0x9d2c5680,15,0xefc60000,18,1812433253 <- standard
w ,n ,m ,r ,a ,u ,d ,s,b ,t ,c ,l ,f
32,624,397,31,0x9908b0df,11, ,7,0x9d2c5680,15,0xefc60000,18, <- paper
这就是差异的来源。同样根据标准,第10,000次迭代std::mt19937
是399268537
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句