C++ 11提供哪些Mersenne Twister?

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)

Nat*_*ica 4

从链接到的论文中查看 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::mt19937399268537