8 c++ random math 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.
....
Run Code Online (Sandbox Code Playgroud)
我的问题是:
这是神话还是有一些真理呢?
如果它可行,那么应该忽略多少位?因为我看到的数字
似乎是随意的
第一条评论中引用的论文《具有改进的初始化的 Mersenne Twister》不仅仅是某个人,他是 Boost 实现所基于的论文的两位共同作者之一。
根据Boost 文档,使用单个 32 位整数(4 字节)作为该生成器的种子的问题是生成器的内部状态为 2496 字节。如此小的种子需要一段时间才能传播到生成器内部状态的其余部分,这并不奇怪,特别是因为 Twister 并不意味着加密安全。
为了解决您对需要运行生成器一段时间才能开始的担忧,您需要备用(且显式)构造函数。
template<typename SeedSeq> explicit mersenne_twister_engine(SeedSeq &);
Run Code Online (Sandbox Code Playgroud)
这是第三条注释的精神,您可以使用比单个整数更长的值进行初始化。序列提供来自某个生成器。要使用熵池,请编写一个生成器作为熵池的适配器,根据需要从池中返回值。