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

时间:2012-03-15 16:16:47

标签: java random

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

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

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

提前致谢。

5 个答案:

答案 0 :(得分:35)

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

Random random = new Random();
double rand = random.nextDouble();
double scaled = rand * 3.3;

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

double shifted = scaled + (-1.1);

所以现在我们可以将这些部分放在一个单独的函数中:

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;
}

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

答案 1 :(得分:7)

double lower = -1554900.101;
double upper = 52952058699.3098;
double result = Math.random() * (upper - lower) + lower;

答案 2 :(得分:2)

应该是这样的:

double rnd = Math.random();

double result = ((long)(rnd * (529520586993098L - (-15549001010L) + 1)) -15549001010L) / 10000.0;

+ 1将平衡范围为[0;1[的事实,因此排除了较高的范围。

我们首先尝试找到一个“整数”(非常长)范围,然后我们加1以平衡最后一个数字被排除的事实,所以529520586993098L + 15549001010L + 1,然后我们将它乘以rnd,将其投放到long并减去15549001010L以将其移回,最后将其除以10000.0,使其位于正确的“范围”内。

这可能更清楚:

long range = 529520586993098L + 15549001010L + 1;

double temp = rnd * range;
long temp2 = (long)temp;
temp2 -= 15549001010L;

double result = temp2 / 10000.0;

答案 3 :(得分:2)

这不是我怎么做的。

  • 生成随机双精度数。结果介于0和1之间。
  • 将此数字乘以(highLimit - lowLimit)(52952058699.3098 - -1554900.101)
  • 添加lowLimit(随机+ -1554900.101)

你走了。你有一个介于低限和高限之间的随机数。

答案 4 :(得分:1)

Random.nextDouble 返回[0,1 [范围]中的双精度数!所以使用它,乘以你的范围大小(52952058699.3098 + 1554900.101)然后偏移结果(减去1554900.101)得到你的号。

不确定你需要多么精确,但如果不进行进一步的分析,由于处理双打的方式,你可能会得到超出范围的数字。