【发布时间】:2012-10-29 01:20:58
【问题描述】:
似乎有一些关于使用 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.
....
我的问题是:
这是神话还是有一些真实性?
如果可行,应该忽略多少位?正如我所看到的数字
似乎很随意
【问题讨论】:
-
这家伙似乎暗示这不是神话:math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html——如果我没看错的话,捻线机需要“一些时间”才能清除起始状态的初始零,并且如果您使用大部分为零的初始状态进行初始化(例如,使用单个 32 位值,将扭曲器的大部分状态保留为零),则这些值将是“不够随机的”(或者,太类似于与种子的汉明距离较低的其他值)。这仅略高于维基百科的研究水平,因此请谨慎对待。
-
@Yakk 很有趣,所以我一直看到的所有这些恶作剧似乎都有“东西”。
-
无论真实性或所需的迭代次数如何,正确的解决方案不是用熵池中的随机位填充整个种子,而不是仅填充前 32 位或其他任何位吗?
-
Gilly:这个问题和 Java 有什么关系?
标签: c++ math random boost-random