在一个模拟项目中,我需要具有公共随机数(可重现性)的不同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;
}


我得到的输出是:

c&#43;&#43; - PRNG MTRand mt.seed()不能按预期工作(?)-LMLPHP

随机数既不相同,单个生成器的“重置”也不起作用。 [编辑:当然有一种模式,但是我不理解/不是应该的]

因为我不是程序员,所以我很困惑,也不知道该怎么办。

如果重要,我将使用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

09-25 20:23