4

この回答を読んだ後: コレクションからランダムなサブセットを選択する最良の方法は?

Javaでランダムなシードをどのように選択するのでしょうか?

また、System.currentTimeMillis() または System.nanoTime() を使用するとは言わないでください。記事を読んで、その理由を確認してください。

難しい質問ですが、もっと難しくさせてください。インターネットに接続せず、ユーザー入力を使用せずにランダム シードを生成する必要があり (IE、GUI はありません)、クロス プラットフォームである必要があるとします (したがって、ハードウェアにアクセスするための JNI はありません)。

ランダム性のソースとして監視できる JVM 変数はありますか?

これはできますか?それとも無理ですか?

4

3 に答える 3

6

Uncommons Mathsを見てください(完全な開示:私はそれを書きました)。これにより、Javaの乱数で発生する問題のほとんどが解決されるはずです。

それを使用しない場合でも、それが提供するさまざまなSeedGenerator実装からいくつかのアイデアを得ることができるはずです。基本的に、デフォルトでは/ dev/randomを使用します。それが存在しない場合(Windowsなど)、random.orgからデータをダウンロードしようとするか、 SecureRandom.generateSeedを使用します。

SecureRandom.generateSeedは、プラットフォーム固有またはインターネットに依存せずに実行できる最善の方法だと思います。

于 2008-09-25T23:28:03.313 に答える
0

System.currentTimeMillis()シードを生成するたびにインクリメントするグローバルカウンターと組み合わせます。カウンターにAtomicLongを使用すると、効率とスレッドセーフで増分できます。

「結合」は、複製を取得するのが簡単すぎるため、「追加」または「xor」を意味するものではありません。代わりに、ハッシュします。複雑になり、長いカウンターをたとえば16バイトとMD5に詰め込むことができますが、おそらく64ビットバージョンのAdlerCRCまたはその他の64ビットCRCを使用します。

于 2008-09-25T23:35:55.867 に答える
0

ええと、その記事は32ビットシードは悪いと言っていますが、64ビットシードは良いです。System.currentTimeMillis()は64ビットシードです。

于 2008-09-26T13:10:46.303 に答える