簡體   English   中英

啟動梅森捻線機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.
....

我的問題是:

  1. 這是神話還是所有真理?

  2. 如果可行,應該忽略多少位? 作為我所看到的數字
    似乎是任意的

在第一條評論中引用的具有改進的初始化功能的Mersenne Twister不僅僅是一個家伙,他還是Boost實現所基於的論文的兩位合著者之一。

根據Boost文檔 ,使用單個32位整數(4個字節)作為此生成器的種子的問題是生成器的內部狀態為2496字節。 這么小的種子需要一段時間才能傳播到生成器的其余內部狀態也就不足為奇了,特別是因為Twister並不意味着密碼安全。

為了解決您需要運行生成器一段時間才能開始的擔憂,您需要備用(顯式)構造函數。

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

這是第三條評論的精神,其中您使用的長度比單個整數長。 提供的順序來自某個生成器。 要使用熵池,請從熵池中編寫一個生成器作為適配器,並根據需要從該池中返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM