硬确定性和Java随机生成器

时间:2018-05-09 18:18:48

标签: java random

我的室友和我正在谈论我们的自由意志。他反对我甜蜜的确定性世界观的最新论点是,Java中的随机数生成器是不可预测的,在运行随机生成器之前没有任何内容可以确定数字的结果。

无论如何,我的问题是当你使用像Math.random和java.util.Random这样的内置Java随机方法时,这个数字是真正随机的还是依赖于任何可预测的事件?我的代码完全需要这个。

1 个答案:

答案 0 :(得分:4)

是的Random类的输出确实取决于可预测的事件。该类使用算法来产生伪随机数。正如docs所说:

  

next的一般契约是它返回一个int值,如果参数位在1和32之间(包括),那么返回值的那么多低位将是(近似)独立选择的位值,每个(大约)同样可能是0或1.接下来的方法由类Random实现,通过原子方式将种子更新为

(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)
     

并返回

(int)(seed >>> (48 - bits)).
     

这是一个线性同余伪随机数发生器,由D. H. Lehmer定义,由Donald E. Knuth在“计算机程序设计的艺术”第3卷:精神数学算法,第3.2.1节中描述。​​