0

私は現在、Java で遺伝的プログラミング アルゴリズムに取り組んでいます。私の実験では、いくつかの設定の組み合わせを試しており、必要な時間を把握するために、すべての設定の組み合わせを数回実行して、平均などを取ることができます.

ただし、シードとして定数値を使用して Random rng インスタンスを 1 つだけ開始したとしても (必ずしも残念なことではありません)、同じ設定で実行すると異なる結果が得られることがあります。

それで、私の質問は、自分のコードで新しい乱数ジェネレーターを明示的に作成することを除いて、ランダム性の他のソースは何でしょうか?

セット、ハッシュなどの方法にあるのでしょうか??? そして、それらの作業を予測可能にするにはどうすればよいでしょうか?

私はすでに Collections.shuffle への呼び出しを確認し、単一の Random インスタンスでそれらをシードしました...

どんな提案でも大歓迎です。

一部のコメントは、コードを投稿することを提案しています。ただし、特定のフィードバックを求めているわけではありませんが、ランダム性の(望ましくない)ソースが何であるかを一般的に知りたいと思っています。私が言及するのを忘れていたのは、もちろん複数のスレッドの使用です。

もちろん、そのソースからのランダム性を防ぐために、強制的にコードをシングル スレッドで実行します。

4

2 に答える 2

2

非決定論のソースとしてのランダムおよびマルチスレッドを排除したら、次に見るべき場所は、コレクションで使用されるオブジェクトにhashCode()およびequals()を実装することを忘れることです。Randomを何にも使用することはありませんが、Object.hashCode()に悪意のある動作を追跡できる非決定論的なプログラムがたくさんあります。

于 2012-06-25T03:17:15.743 に答える
1

java.util.Random で生成される乱数のシーケンスは、初期化に使用される特定のシードと同じであることが保証されています。API ドキュメントから:

Random の 2 つのインスタンスが同じシードで作成され、それぞれに対して同じ一連のメソッド呼び出しが行われた場合、それらは同一の数列を生成して返します。

したがって、簡単に言えば、これは、RNG に対して行われるメソッド呼び出しの数またはシーケンスを変更する場合にのみ発生する可能性があるということです。コメントで言及されているように、最も可能性の高い説明は、RNG を使用する複数のスレッドがあることです。この場合、非決定論的な OS スケジューリングにより、呼び出しシーケンスが実行ごとに異なる可能性があることは明らかです。

これは、シングル スレッド アプリケーションであっても、厳密に順序付けされていないイベント ハンドラから直接的または間接的に RNG を使用する場合に発生する可能性があります。たとえば、ユーザー (またはユーザーが使用するライブラリ)Randomがマウス、キーボード、またはネットワーク イベントのイベント ハンドラーから使用する場合、これらのイベントが処理される非決定論的な順序により、メインライン コードによって生成される番号のシーケンスが変更される可能性があります。

于 2012-06-25T02:00:49.840 に答える