java - 如何从一个范围中随机获取 double 值

标签 java random

我实际上正在做一个项目,但有一个问题: 我必须从 [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/

相关文章:

c++ - rand() 函数生成错误范围内的数字

c - 在 C 中生成 [-1, 1] 之间的随机数?

javascript - Spring MVC AngularJS 前端与后端分离

java - 查看 oracle 应用程序并获取 : java. lang.ClassNotFoundException : oracle. forms.engine.Main

java - DDD : Delete on a Repository vs delete on an Entity?

c++ - 随机大小的对象 C++

php - 构建一个更真实的随机词生成器?

关于类加载器的java类标识

java - 无法从maven中安装的jar加载类

java - 没有两个连续对象相同的随机选择序列