Java Random类,使用相同的种子和nextBytes()生成重复的数字?

Osc*_*mez 1 java random duplicates random-seed

假设我通过使用新的Random()实例化静态最终Random对象来使用相同的种子,是否可以通过在同一实例中调用nextBytes来获得相同的数字两次?

我知道对于任何给定的种子,可以确定所有可能的"随机"数字,它实际上更像是一个序列:

  synchronized protected int next(int bits) {
     seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
     return (int)(seed >>> (48 - bits));
}
Run Code Online (Sandbox Code Playgroud)

所以基本上如果我有这个代码:

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)
   }
 }
Run Code Online (Sandbox Code Playgroud)

nextBytes在通过它可以生成的所有可能数字之前产生相同字节的可能性有多大?

在返回给定位的所有可能组合之前,它会返回相同的值吗?我猜是的,但这种情况多久发生一次?

Ted*_*opp 5

Class Random使用具有非常大周期的线性同余生成器.它很长时间都不会重复int值.对nextBytes8字节数组的调用会生成两个int值,并将每个值分成四个8位值来填充数组.

我相信连续调用不可能nextBytes生成相同的值.这意味着随机数生成器的周期为2. 文档指定了一个特定的行为,next这使得这是不可能的.(Random当然,子类可以有任何你喜欢的病态行为,但是一个例子java.util.Random会很好.)