我实际上正在做一个项目,但有一个问题:
我必须从 [a, b]
范围内生成一个随机 Double
值。通过网上搜索,有人说下面的公式有效:
b + (b - a) * random.nextDouble();
但是如果我们计算一下,我们发现a
不可能包含在内。
我怎样才能做这样的事情?有人知道吗?
预先感谢您的帮助!
最佳答案
nextDouble
函数的工作原理是创建一个 53 位整数,然后将其除以 2 ^ 53。来自 javadocs:
public double nextDouble() {
return (((long)next(26) << 27) + next(27))
/ (double)(1L << 53);
}
因此,这会产生范围 [0, 1)
- 接近 (n - 1)/n
极限的上限。
要创建完全包含范围,请自行创建 53 位整数,但除以 (2 ^ 53) - 1
。
请注意,对于所有意图和目的,包含和排除之间的差异几乎不重要 - 使用修改后的代码准确命中 1.0
的几率为 1/((2 ^ 53) - 1 )
- 一个几乎无限小的数字。
此外,除以 (2 ^ 53) - 1
可能会比原始代码慢很多。除以 2 ^ n
对于 CPU 来说是完全微不足道的,因为它所做的只是减少浮点指数并可能左移尾数。除数上的 - 1
使除法变得更加冗长,甚至可能使结果序列的随机性低于低位中的随机性。
关于java - 如何从一个范围中随机获取 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26461382/