C++ 为Mersenne捻线机PRNG打底

C++ 为Mersenne捻线机PRNG打底,c++,math,random,boost-random,C++,Math,Random,Boost Random,似乎有一些神话围绕使用,特别是一旦种子'一些'数量的比特产生的发生器应该被忽略,以便只有尽可能接近伪随机性 我看到的代码示例如下: 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::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::mt19937::result_type seed=1234567//从某个熵池中提取
增压:mt19937 prng(种子);
统一国际区(01000);
增压:变量发生器(prng,dist);
无符号整数跳过=10000;
while(跳过--)
{
发电机();
}
//现在开始真正使用。
....
我的问题是:

  • 这是一个神话还是真的

  • 如果它是可行的,那么应该忽略多少位呢?正如我看到的数字
    似乎武断


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

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

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

    template<typename SeedSeq> explicit mersenne_twister_engine(SeedSeq &);
    
    模板显式mersenne_twister_引擎(SeedSeq&);
    

    这就是第三条注释的精神所在,在这里,您可以使用比单个整数更长的值进行初始化。提供的序列来自某个生成器。要使用熵池,请编写一个生成器作为熵池中的适配器,根据需要从熵池中返回值。

    这家伙似乎暗示这不是一个神话:--如果我读对了,twister需要“一段时间”才能清除起始状态中的初始零,如果您使用基本为零的初始状态初始化(比如说,使用单个32位值,将twister的大部分状态保留为零),这些值将“不够随机”(或者,与其他与种子之间的汉明距离较低的值太相似)。这几乎不超过维基百科的研究水平,所以请恕我直言。@Yakk很有趣,所以我一直看到的这些胡说八道似乎都有“某些东西”。不管真实性或所需的迭代次数如何,正确的解决方案不是用熵池中的随机比特填充整个种子,而不是只填充fi吗rst 32或其他位?吉利:这个问题和Java有什么关系?