Java如何生成随机数?

我知道你可以在Java中使用Math.random()来生成从0.0到1.0的随机双精度,但是计算机如何选择一个数字? 计算机跟随模拟随机性的代码是什么?

通过查看文档可以很容易地发现这一点,因为很快,这种行为在Java中得到了很好的定义。 从Math来看,它说

首次调用此方法时,它会创建一个新的伪随机数生成器,就像表达式一样

new java.util.Random()

遗憾的是,它没有明确说明Random调用哪种方法。 但是,由于它的返回值与Random.nextDouble在同一范围内,它也链接到“另请参见”部分,因此它应该是一个安全的假设,即使用它。

看看Random.nextDouble ,你可以看到

 return (((long)next(26) << 27) + next(27)) / (double)(1L << 53); 

next实现为

以primefaces方式将种子更新为

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

并返回

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

所以最终的随机值计算如下

 seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1) next1 = (int)(seed >>> (48 - 26)) seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1) next2 = (int)(seed >>> (48 - 27)) randomValue = (((long)next1 << 27) + next2) / (double)(1L << 53); 

哪里

随机数生成器的种子[初始化为]一个非常可能与此构造函数的任何其他调用不同的值。

Random文档中所述

通过观察这一点,应该很清楚,这个数字实际上并不是“随机的”,因为大多数人都会理解它。 它是一种完全可预测的数学模式,称为伪随机数,对于许多目的来说,它是随机的。 但是,根据您希望结果的不可预测性,可能值得研究SecureRandom (它产生不可预测的,加密强的随机值)。

关于随机数的真相是它们并非真正随机。 它们只是用当前时间计算mili / nano(甚至更少)-seconds …因为时间总是在变化而且永远不会重复,因为“相同的原因”的值不能是随机的编号一个随机数…

查看@FranciscoSpaeth的答案:

https://stackoverflow.com/a/11317929/3180983

您可以在Java类声明中跟踪它。 这个来自Math.class:

 public static double random() { return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble(); } 

它很容易在Eclipse中完成。 专注&F3。