在一个模拟项目中,我需要具有公共随机数(可重现性)的不同PRNG,我使用的是Jasper Bedaux(http://www.bedaux.net/mtrand/)的Mersenne Twister实现。现在,按照我的理解,以下循环应产生一个与整数关联的唯一随机数(即,如果使用相同的种子初始化,则不同的实例应产生相同的随机数):
#include <iostream>
#include "mtrand.cpp"
int main()
{
MTRand tester_sh;
MTRand tester_se;
std::cout << std::fixed;
std::cout << "This is a simple test program.\n";
for (int sh = 1; sh < 3; sh++) {
for (int se = 1; se < 3; se++) {
tester_sh.seed( sh );
tester_se.seed( se );
std::cout << "\n" << sh << "\t" << tester_sh() << "\t" << se << "\t" << tester_se() ;
}
}
return 0;
}
我得到的输出是:
随机数既不相同,单个生成器的“重置”也不起作用。 [编辑:当然有一种模式,但是我不理解/不是应该的]
因为我不是程序员,所以我很困惑,也不知道该怎么办。
如果重要,我将使用cygwin64 \ bin \ x86_64-w64-mingw32-g ++。exe和选项-g -Wall -lm -std = gnu ++ 14 -o%Name%.exe%Name %% Ext编译模型%,在Windows 7、64位上使用cygwin的当前版本。
欢迎任何帮助!
最佳答案
由于某些奇怪的原因,MTRand
的状态为static
,因此该状态在MTRand
实例之间共享。一个非常糟糕的决定。
也许您可以通过使状态为非静态来解决此问题。或者只是使用更好的MT实现。 (顺便说一句,C ++ 11具有std::mersenne_twister_engine
)