2

乱数ジェネレーターを使用する場合、これは新しい値のランダム性を高めるために使用するより良い方法です。

  1. 毎回 RNG の新しいインスタンスをインスタンス化し、値を返すメソッドがありますか?

  2. クラス レベルで RNG のインスタンスがあり、これはコンストラクターで一度インスタンス化され、既存のインスタンスを使用して新しいランダム値の後続のすべての呼び出しが行われますか?

問題は、多くの場合、互いに接続されていない異なるスコープで、乱数の呼び出しが多数ある可能性があることです。

これはパフォーマンスの問題ではないため、各呼び出しが新しいインスタンスをインスタンス化する可能性があるという事実は違いはありません。これはすべて、戻り値のランダム性に関するものです。

4

3 に答える 3

8

オプション1は実際には機能しません。

オプション 2 が唯一の選択肢です。RNG では、単一のシードから値を順番に生成することが絶対に必要です。

あなたの「新しいシードで新しいジェネレーターを作成する」ことは、数学的基礎を壊します。そのとき得られるものは完全にシードに依存しますが、それは残念ながら非常にランダムではありません.

于 2008-11-25T11:24:31.607 に答える
4

オプション 3 を提案します。プログラム全体で単一の RNG を使用します。RNG がスレッド セーフでない場合 (.NET など) は、ロックまたはスレッド ローカルが必要ですが、これにより作業が大幅に簡素化され、繰り返しについて心配する必要がなくなります。

この目的のために私が作成した .NET StaticRandom クラスの詳細については、関連する MiscUtil ページを参照してください。(これは信じられないほど単純です。巧妙なことは何もありません。)

于 2008-11-25T11:36:56.167 に答える
3

編集:別の回答、つまりグローバルランダムマネージャーで述べたように、オプション3を意味すると思いますが、特定のクラス内ではまったく同じことができます。

オプション 2 を使用するもう 1 つの利点は、ソフトウェアで「リプレイ」機能が必要になった場合に、RNG の初期化に使用したシードを簡単に保存できることです。次回は、保存されたシードを使用するように RNG を強制するだけで、実行順序を変更する可能性のある同時実行/スレッドなどの問題が他にないと仮定すると、まったく同じ一連の動作が得られます。

ソフトウェアが多くのランダム性を必要とする実験を実行している場合、このようなことをしたいかもしれませんが、他の人にデモンストレーションするために特定の実行を繰り返したい場合があります. これは、AI が可能な選択肢の重み付けに基づいて決定を下すコンピュータ ゲームでもよく使用されますが、最終的には乱数がどのアクションを実行するかを「選択」します。

また、たまにしか発生しない一過性のバグのデバッグも可能です。各実行のシードを保存しない場合、バグの原因となった正確な条件を再現する方法はありません。

于 2008-11-25T11:43:10.290 に答える