Java.Random环绕

Ber*_*unt 0 java

我发现多个引用说Java.Random PRNG将在2 ^ 48个数字出现问题之后回滚.有没有人用代码对它进行了实际测试并确定它何时包含?

谢谢

jas*_*son 8

好吧,Java Random是带有48位种子的LCG.这在文档中列出:

该类使用48位种子,使用线性同余公式进行修改.(参见Donald Knuth,计算机程序设计的艺术,第2卷,第3.2.1节.)

没有必要对它进行测试.LCG 非常了解.Knuth实际上确实在TAOCP第2卷中做得很好(这是他所有书中最具可读性的材料).

已知Java中LCG的乘数为25214903917,我们非常了解生成器.Java所做的是将LCG的输出的第16位到第47位产生32位输出.这样做是因为已知低阶位具有比高阶位短的周期.

  • +1从技术上讲,它会生成32位值,如果你执行nextInt(2),它应该在32*2 ^ 48之后换行. (2认同)