1

new Random() を使用して static final Random オブジェクトをインスタンス化することで同じシードを使用していると仮定すると、同じインスタンスで nextBytes を呼び出して同じ数を 2 回取得することは可能ですか?

特定のシードについて、可能なすべての「乱数」を決定できることを認識しており、実際にはシーケンスに似ています。

  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 が生成可能なすべての数値を処理する前に、同じバイトを生成する可能性はどのくらいありますか?

これは、指定されたビットのすべての可能な組み合わせを返す前に同じ値を返しますか?. はいと思いますが、これはどのくらいの頻度で起こりますか?

4

3 に答える 3

5

クラスRandomは、非常に大きな周期を持つ線形合同法を使用します。非常に長い間int値を繰り返すことはありません。8バイト配列を使用してを呼び出すとnextBytes、2つのint値が生成され、それぞれが4つの8ビット値に分割されて配列が埋められます。

nextBytes連続して同じ値を生成することは不可能だと思います。これは、乱数ジェネレーターの周期が2であることを意味します。ドキュメントnextでは、これを不可能にする特定の動作を指定しています。Random(もちろん、のサブクラスは、好きな種類の病理学的動作を持つことができますが、のインスタンスはjava.util.Random正常に動作します。)

于 2011-06-24T02:43:13.080 に答える
0

同じ値が繰り返されないことを示唆する上記の回答は、Java.Randomの期間の長さが2^48であることを忘れているようです。そのため、nextInt()は、RNGの期間内のすべての値を通過する前に、まったく同じ整数を生成する可能性があります。実際には2^16回。

また、整数は4つに分割されているため、すべての整数を調べなければならない場合でも、同じバイトが表示される可能性があります(表示されます)。実際、その場合、すべての整数値を調べる前に、すべてのバイト値が2^24回表示されます。ただし、元の質問は8バイトで構成されるバイト配列に関するものでした。この場合、nextByteへの2 ^ 31(Javaのランダムの場合は2 ^ 47)の呼び出し後に同じ配列を取得します(2つの整数が必要なため)。

前に言ったように、すべての整数を調べる必要はありません。

そうは言っても、nextInt()によって返される値の一様分布を仮定すると、一連のn個のサンプルでまったく同じ整数を取得する確率は約1-((2 ^ 32 -1)/ 2 ^ 32 )^(n(n-1)/ 2)。http://en.wikipedia.org/wiki/Birthday_problemを参照してください

2つの一致する整数を持つ確率が50%を超えるために描画する必要のあるサンプルの数は、77000を少し超えるだけです。代わりに、2 ^ 64の数値、または2つの2 ^ 32の整数を均一に描画すると仮定すると( 8バイトの場合)、5 * 10 ^9サンプル後に同じ確率が得られます。これは約2^32です。その時までにすべての整数を見ることができたとしても、これはランダムの期間よりもかなり短いことに注意してください。真実はおそらくその中間にあります。とにかく、確率は非常に低いですが、上記の投稿で示唆されているように完全にゼロではありません。

私は何かが足りないのですか?

于 2011-08-10T09:53:55.107 に答える
0

nextBytes が前の反復で返された値と同じ値を返す確率は、nextBytes が特定のランダムな 8 バイトを返す確率とまったく同じです。

優れた乱数ジェネレーターは、ビットがランダムであるという事実以外に、返されるビットについて何の保証も行いません。ジェネレーターがすべての可能な値をランダムな順序で返すようにすることが望ましい場合もありますが、これは通常、ランダム ジェネレーターの目標ではありません。

于 2011-06-24T02:29:33.380 に答える