Priming the Mersenne twister PRNG
Priming the Mersenne twister PRNG
似乎围绕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.
....
我的问题是:
这是神话还是有些事实?
如果它可行,应该忽略多少位?作为我看到的数字
似乎是任意的
在第一个评论中引用的论文,默瑟恩·扭动的初始化,不仅是某人,而且他是该论文的两个合着者之一。
根据Boost文档,使用单个32位整数(4个字节)作为该发电机的种子的问题是,发电机的内部状态为2496字节。这么小的种子需要一段时间才能传播到发电机的其余状态,尤其是因为Twister并不意味着在密码上安全。
,这并不奇怪。要解决您对需要运行发电机一段时间以开始的担忧,您需要替代(和显式)构造函数。
template<typename SeedSeq> explicit mersenne_twister_engine(SeedSeq &);
这是第三条评论的精神,您可以用比单个整数更长的东西初始化。序列提供的序列来自某些发电机。要使用熵池,请将发电机从熵池写成适配器,根据需要从池中返回值。
相关文章:
- 如何简洁、便携、彻底地为 mt19937 PRNG 播种
- 为什么Visual Studio Compiler不在我的Mersenne-Twister实现中循环展开?
- PRNG种子到底是什么,它在c ++中是如何工作的?
- 使用Mersenne-Twister生成多个随机值
- 如何使用Mersenne Twister生成两个数字之间的所有值一次
- PRNG程序故障.无法输入随机数量的选择,并且将始终从PRNG中回答2
- Box Muller Transform在实现正态分布PRNG时的问题
- 如何通过Mersenne Twister生成不重复的随机变量
- 正确地播种随机数发生器(Mersenne Twister)C
- Priming the Mersenne twister PRNG
- 如何在函数中运行Mersenne Twister
- 如何获得C++ Mersenne Twister 19937生成器在Windows和Linux上给出相同的结果
- rand() and a Mersenne Twister C++ implementation
- 井PRNG不工作?(也许)
- C++11丢弃PRNG序列中的数字
- boost c++正在使用Mersenne Twister算法生成0到1之间的相同随机数
- 支持存储/恢复排序状态的PRNG库
- Mersenne Twister随机生成器-两个VS2010并行运行
- PRNG背后的理论是什么?
- c++中PRNG的默认随机引擎为每个适当种子的实例生成相同的输出