4

概要: プログラムが起動されるたびにシードが異なるように、RNG をシードする簡単な自己完結型の方法が必要です。

詳細:

結果に関する良い統計を得るために、同じプログラム (モンテカルロ シミュレーションなどの乱数を使った計算を行うプログラム) を何度も実行する必要があることがよくあります。この場合、乱数ジェネレーターが実行ごとに異なるシードを持つことが重要です。

プログラム自体に含めることができる、これに対する単純なクロスプラットフォームのソリューションが必要です。(つまり、異なるシード パラメータを使用してプログラムの各インスタンスを起動するスクリプトを作成するという面倒な作業を常に行う必要はありません。)

time(0)タイマーの分解能が悪いため、シードとして使用することは良い解決策ではないことに注意してください。複数のプロセスが並行して起動される場合、それらは から同じシードを取得する可能性がありtime(0)ます。

要件:

  • できるだけシンプルに
  • クロス プラットフォーム (現在、Windows と Linux、x86 と x64 のみで動作する必要があります)。
  • 自己完結型: プログラムを起動する特別な方法に依存するべきではありません (起動スクリプトからパラメータとしてシードを渡すのは面倒です)。
  • すべてを小さなライブラリにラップして、最小限の労力で新しいプロジェクトに含めることができ、次のようなことをしたいと思いますSeedMyRNG(getSeed());

編集:

os.urandom()私の主な質問は、C (または C++) でこれを行うことについてでしたが、Python ソリューションとして見つけた回答で提供されたポインターに基づいています(これは私にとっても役立ちます)。

関連する質問: C で /dev/random または urandom を使用するには?

4

4 に答える 4

4

「クロスプラットフォーム」は主観的な用語です。「任意のプラットフォーム」(将来的に遭遇する可能性があります) または「すべてのプラットフォーム」(サポートされているプラ​​ットフォームのリスト) を意味しますか? これが私が通常とる実用的なアプローチです:

  1. あなたが持っているかどうかを確認してください/dev/urandom。はいの場合は、そこからシードします。

  2. Windows では、 を使用しますCryptGenRandom()

  3. 他のすべてが失敗した場合は、シードからtime().

于 2011-07-27T12:54:18.247 に答える
1

Linuxではdevrandomを使用し、Windowsではcryptoapiを使用できます。プラットフォームに依存しないインターフェースを提供する小さなライブラリーを作成すると、それはまさにあなたが望むことをするはずです。

于 2011-07-27T13:00:43.707 に答える
1

シードを適切にサポートする C++ 乱数ライブラリであるRandomLibを確認してください。特に

Random r;
r.Reseed();

(RandomSeed::SeedVector() への呼び出しから) ほぼ確実に一意である数値のベクトルでr をシードします。これには、時間、マイクロ秒、pid、ホスト ID、年が含まれます。

あまり最適ではありませんが、可能であれば /dev/urandom から読み取る RandomSeed::SeedWord() でシードすることもできます。ただし、シードとして単一の 32 ビット ワードを使用して 2^16 を実行すると、通常はシード衝突が発生します。そのため、アプリケーションが何度も実行される場合は、ベクターによって提供されるより大きなシード スペースを使用することをお勧めします。

もちろん、これは、ベクトル シードを利用できる乱数ジェネレーターを使用していることを前提としています。RandomLib は MT19937 と SFMT19937 を提供します。どちらもベクター シードを使用します。

于 2011-07-28T15:11:57.523 に答える
0

2014 年 8 月 4 日の更新:

Boost は現在、クロスプラットフォームで実装されています random_device。予測不可能なシードを使用してブーストから疑似乱数ジェネレーターをシードする例を次に示します。

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/random_device.hpp>

boost::random::mt11213b rng( (boost::random_device())() );
于 2014-08-05T03:11:38.607 に答える