围绕mt19937的使用似乎存在一些神话,特别是一旦生成器产生的种子数量“播种”了一些种子,就应该忽略掉它们,以使其尽可能接近伪随机性。

我看到的代码示例如下:

boost::mt19937::result_type seed = 1234567; //taken from some entropy pool etc
boost::mt19937 prng(seed);
boost::uniform_int<unsigned int> dist(0,1000);
boost::variate_generator<boost::mt19937&,boost::uniform_int<unsigned int> > generator(prng,dist);

unsigned int skip = 10000;
while (skip--)
{
   generator();
}

//now begin using for real.
....

我的问题是:
  • 这是神话还是所有真理?
  • 如果可行,应该忽略多少位?作为我所看到的数字
    似乎是任意的
  • 最佳答案

    第一条评论中引用的论文Mersenne Twister with improved initialization不仅是个人,而且还是Boost实现所基于的论文的两位合著者之一。

    根据Boost documentation,使用单个32位整数(4个字节)作为此生成器的种子的问题在于,生成器的内部状态为2496字节。这么小的种子需要一段时间才能传播到生成器的其余内部状态也就不足为奇了,特别是因为Twister并不意味着密码安全。

    为了解决您需要运行生成器一段时间才能开始的担忧,您需要备用(显式)构造函数。

    template<typename SeedSeq> explicit mersenne_twister_engine(SeedSeq &);
    

    这是第三条评论的精神,其中您使用的长度比单个整数长。提供的顺序来自某个生成器。要使用熵池,请从熵池中编写一个生成器作为适配器,并根据需要从该池中返回值。

    关于c++ - 灌注梅森捻线机PRNG,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13114823/

    10-12 23:58