c++ - 启动 Mersenne twister PRNG

标签 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. 如果可行,应该忽略多少位?正如我看到的数字
    似乎很随意

最佳答案

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

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

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

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

这是第三条评论的精神,你用比单个整数更长的东西初始化。提供的序列来自某个生成器。要使用熵池,请将生成器编写为熵池的适配器,并根据需要从池中返回值。

关于c++ - 启动 Mersenne twister PRNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114823/

相关文章:

python - Layer drop 和 update caffe 模型

java - 循环 i 和 j,其中 i != j

math - float 学有问题吗?

c - C 中无重复的随机数数组

ios - Firebase iOS swift : how to pick a random userProfile?

C++继承模式

c# - C# 中的 C++ CString 等价物

java - 如何创建一个包含 "n"个随机整数的数组?

c++ - 在容器中存储模板化派生类

sql - PostgreSQL 计算阈值查询