8

There seems to be some mythology around the use of mt19937, specifically that once seeded 'some' number of bits produced by the generator should be ignored so as to have only as near as is possible to pseudo randomness.

Examples of code I've seen are as follows:

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.
....

My questions are:

  1. Is this myth or is there some truth to it all?

  2. If it's something viable, how many bits should be ignored? as the numbers I've seen
    seem to be arbitrary

4

1 に答える 1

4

最初のコメントで参照されている論文Mersenne Twister with better initializationは、ただの人間ではなく、Boost 実装の基になっている論文の 2 人の共著者の 1 人です。

このジェネレーターのシードとして単一の 32 ビット整数 (4 バイト) を使用する際の問題は、Boost のドキュメントによると、ジェネレーターの内部状態が 2496 バイトであることです。このような小さなシードがジェネレーターの残りの内部状態に伝播するのにしばらく時間がかかることは、特に驚くべきことではありません。

開始するためにしばらくの間ジェネレーターを実行する必要があるという懸念に対処するには、代替 (かつ明示的な) コンストラクターが必要です。

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

これは、単一の整数よりも長い何かで初期化する 3 番目のコメントの精神です。シーケンス提供は、いくつかのジェネレーターから来ています。エントロピー プールを使用するには、エントロピー プールからのアダプターとしてジェネレーターを記述し、必要に応じてプールから値を返します。

于 2012-11-08T14:48:03.340 に答える