ランダム性の2つのソースを含むクラスがあります。
std::random_device rd;
std::mt19937 random_engine;
std::mt19937
を呼び出してシードしstd::random_device
ます。番号を生成したいのに再現性を気にしない場合は、電話する必要がありますrd()
かrandom_engine()
?
私の特定のケースでは、パフォーマンスがそれほど重要ではなく、結果が特に敏感ではない一部のネットワーキングコードで呼び出されるため、両方とも問題なく機能すると確信しています。ただし、ハードウェアエントロピーをいつ使用するか、および疑似乱数をいつ使用するかについてのいくつかの「経験則」に興味があります。
現在、私はエンジンのstd::random_device
シードにのみ使用してstd::mt19937
おり、プログラムに必要な乱数の生成には、std::mt19937
エンジンを使用しています。
編集:これは私がこの特定の例を使用している正確な説明です:
これはゲームプレイプログラム用です。この特定のゲームでは、ユーザーは対戦相手とのラウンドを開始する前に「チーム」をカスタマイズできます。戦闘の設定の一部には、サーバーにチームを送ることが含まれます。私のプログラムにはいくつかのチームがあり、乱数を使用してロードするチームを決定します。新しい戦いのたびstd::random_device
に、疑似乱数ジェネレーターをシードするための呼び出しが行われます。ランダムに選択したこのチームと初期シードを含む、戦闘の初期状態をログに記録します。
この質問で私が質問している特定の乱数は、ランダムなチーム選択(対戦相手に、私が使用しているチームを事前に知らないことが有益であるが、ミッションクリティカルではない)のためのものですが、私はm本当に探しているのは経験則です。番号の再現性が必要ない場合は常に使用しstd::random_device
ても問題ありませんか、それとも収集できるよりも早くエントロピーを使い果たすリスクがありますか?