在用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)方法,或者针对此问题进行其他修复吗?
谢谢您的帮助!
你比较了从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
| 归档时间: |
|
| 查看次数: |
1253 次 |
| 最近记录: |