Java Random,种子变化很小,只会导致输出变化不大

Szo*_*omi 8 java random seed

在用Java创建地图生成器时,我发现它们的随机数生成器存在一个相当令人不安的问题,指定当两个RNG具有非常相似的种子(小整数不同)时,它们的第一个输出值将变得非常相似!

示例代码:

Random r = new Random();
long n = 100000; //Choose any number
r.setSeed(n);  
System.out.println(r.nextInt());
r.setSeed(n+1);
System.out.println(r.nextInt());
Run Code Online (Sandbox Code Playgroud)

这几乎打破了我对原始Java RNG的信心,因为我使用坐标为地图生成器播种.有人可以建议重新定义Random.next(int bits)方法,或者针对此问题进行其他修复吗?

谢谢您的帮助!

rat*_*eak 8

你比较了从100000和100001得到的前20个值的顺序吗?

这些是种子100000和100001的第20个下一个种子.与第三列中的不同位数量(2之间的xor的bitcount)

最后一列应保持在16左右

-1986972922 -1987357671 13
-1760380366 -604895790  16
-1057894078 -329706441  15
-363772240  -1218064509 15
1545317691  -300240831  14
271304166   -900428132  21
1208561582  273461468   16
-1257783052 1069490639  16
-1549884799 40157720    15
-1514737808 -1818800021 17
-1030569735 1859508545  15
1310070992  880402584   18
-1513092400 971613287   19
-1993219517 354161779   16
-10847170   -204018237  15
-965377044  1488135032  14
802471291   1094582308  22
-539776032  -1021376555 15
2088199751  2070302462  12
-1271582124 64627614    19
Run Code Online (Sandbox Code Playgroud)

他经历了3-5次迭代后并没有那么相似

除了标准的Random之外,还实现了一个线性同余RNG,它已知不是现有的最佳伪随机实现,但最有效的存储器(一段时间只有一个64位字2^48)

对于感兴趣的乘数是0x5deece66dL和c是0xbL