【发布时间】:2016-01-06 09:50:28
【问题描述】:
我无法确定 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 的 stdlibc++ 在 Fedora 22 上运行。
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;
}
【问题讨论】:
-
@Praetorian - 好吧,我不确定,但我不这么认为。我没有使用 Boost;相反,我通过
libstdc++使用GNU 的实现。 -
它使用math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c。 IOW,@Praetorian 链接到什么。
-
嗯,Boost 实现是
std::tr1::mt19937的前身,后来在 C++11 中成为std::mt19937,因此 Boost cmets 可能非常相关。您应该点击我之前评论中的第二个链接,并与那里提供的输出进行比较。
标签: c++ c++11 random mersenne-twister