在Java中生成特定范围的随机双数

isa*_*iah 9 java random

我已经看过很多解释这个问题的帖子,但他们都使用了整数值,老实说,我不完全理解它,因此这个问题:

我试图在java中生成范围(-1554900.101)到(52952058699.3098)的随机数,我想知道是否有人可以向我解释这个,因为我真的想了解它.

我的想法:这是一个正确的方法吗?1)在我指定的范围内生成随机整数2)将生成的数除以pi,得到浮点/双随机结果

提前致谢.

mae*_*ics 35

这是个主意.你想在一个随机数的范围,比方说[-1.1,2.2],一个简单的例子开始.该范围的长度为3.3 2.2 - (-1.1) = 3.3.现在,大多数"随机"函数返回范围内的数字[0,1),其长度为1,因此我们必须将随机数缩放到所需范围内.

Random random = new Random();
double rand = random.nextDouble();
double scaled = rand * 3.3;
Run Code Online (Sandbox Code Playgroud)

现在我们的随机数具有我们想要的幅度,但我们必须将它在数字线中移动到我们想要的确切值之间.对于这一步,我们只需要将整个范围的下限添加到我们的缩放随机数中,我们就完成了!

double shifted = scaled + (-1.1);
Run Code Online (Sandbox Code Playgroud)

所以现在我们可以将这些部分组合在一个函数中:

protected static Random random = new Random();
public static double randomInRange(double min, double max) {
  double range = max - min;
  double scaled = random.nextDouble() * range;
  double shifted = scaled + min;
  return shifted; // == (rand.nextDouble() * (max-min)) + min;
}
Run Code Online (Sandbox Code Playgroud)

当然,这个函数需要对意外值进行一些错误检查,NaN但是这个答案应该说明一般的想法.


hig*_*ted 7

double lower = -1554900.101;
double upper = 52952058699.3098;
double result = Math.random() * (upper - lower) + lower;
Run Code Online (Sandbox Code Playgroud)