启动Mersenne twister PRNG

时间:2012-10-29 01:20:58

标签: c++ math random boost-random

似乎有一些关于使用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.
....

我的问题是:

  1. 这是神话还是有一些道理呢?

  2. 如果它可行,那么应该忽略多少位?就像我见过的数字一样 似乎是任意的

1 个答案:

答案 0 :(得分:4)

第一条评论Mersenne Twister with improved initialization中引用的论文,并不仅仅是某些人,他是Boost实施所依据的论文的两位共同作者之一。 / p>

根据Boost documentation,使用单个32位整数(4个字节)作为此生成器的种子的问题是生成器的内部状态为2496个字节。这种小种子需要一段时间才能传播到发生器的其他内部状态,这一点并不令人惊讶,特别是因为Twister并不意味着加密安全。

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

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

这是第三条评论的精神,您可以使用长于一个整数的内容进行初始化。序列提供来自一些发生器。要使用熵池,请将生成器作为适配器从熵池中编写,并根据需要从池中返回值。