新しいRandom()で静的最終ランダムオブジェクトをインスタンス化して同じシードを使用していると仮定すると、同じインスタンス内でnextBytesを呼び出すことによって同じ番号を2回取得できますか?Java Randomクラスは、同じシードとnextBytes()を使用して重複数を生成しますか?
私は、任意の種のために、すべての可能な「ランダム」番号を決定することができることを知っていますし、それはより多くのシーケンス本当に好きです。私はこのコードを持っているのであれば、基本的
synchronized protected int next(int bits) {
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (int)(seed >>> (48 - bits));
}
:
private static final Random random = new Random();
public void doSomething() {
for (int i=0; i < 1000000000; i++) {
byte byteArray[] = new byte[8];
random.nextBytes(byteArray)
}
}
生成可能なすべての数値を調べる前に、nextBytesが同じバイトを生成する可能性はどれくらいですか。
これは、指定されたビットのすべての可能な組み合わせを返す前に同じ値を返しますか?はい、私は推測していますが、これはどのくらいの頻度で起こりますか?
期間によって、最終的にその種子が元の値になることを意味しますか?もちろん、正確に同じ数を再度生成しますか?例えば、java.util.Randomで1から1000までの乱数を生成している場合、与えられた数を生成する確率は0か1/1000よりも何か高いですか? –
それは正しいです。 java.util.Randomによって生成される数値シーケンスは、シードが設定されると完全に確定的です。それが_pseudo_ randomと呼ばれる理由です。次の1000個の数字に存在する所定の数字の「確率」は、0または1のいずれかです。これを予測することは非常に困難であり、統計的な目的のために数字がランダムである場合に動作します。より強力な乱数ジェネレータについては、 'java.security.SecureRandom'クラスを見てください。 –