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的答案:
您可以在Java类声明中跟踪它。 这个来自Math.class:
public static double random() { return RandomNumberGeneratorHolder.randomNumberGenerator.nextDouble(); }
它很容易在Eclipse中完成。 专注&F3。