jww*_*jww 10 c++ random mersenne-twister c++11
我无法确定Mersenne Twister C++ 11提供的变体.在Mersenne Twister:A 623 Dimensionally Equidistributed Uniform Pseudorandom Number Generator中查看Matsumoto和Nishimura ACM论文,作者提供算法,算法的实现,并调用它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;
}
Run Code Online (Sandbox Code Playgroud)
从链接到的论文中查看 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
Run Code Online (Sandbox Code Playgroud)
这就是差异的来源。另外根据标准,第 10,000 次迭代std::mt19937
是399268537
归档时间: |
|
查看次数: |
792 次 |
最近记录: |