给定范围内的随机双精度,包括 [-MAX_VALUE,MAX_VALUE]



如何实现一个能够将+-Double.MAX_VALUE作为参数处理的函数getRandomDouble(min,max)

在线研究:

这个问题的大多数答案是:

public Double getRandomDouble(double min, double max) {
return min + (max-min)*Random.nextDouble(); 
}

如果minmax不是+-Double.MAX_VALUE,这工作正常。如果是这样,则max-min超出范围或无穷大。将参数更改为BigDecimal可以解决此问题,但结果始终是带有 50 个零且没有小数的双精度值。这是非常大的数字(2*MAX_VALUE(乘以[0,1]之间的双精度数的结果,只有一个视图小数。

因此,我找到了这样的+-MAX_VALUE解决方案:

public double getRandomDouble() {
while(true) {
double d = Double.longBitsToDouble(Random.nextLong());
if (d < Double.POSITIVE_INFINITY && d > Double.NEGATIVE_INFINITY)
return d;
}
}

这工作正常,但不考虑其他边界。

我怎样才能结合这两种方法,在可能+-MAX_VALUE的给定范围内获得随机双倍?

如果它不仅适用于最大值,我想我有一个解决方案。

在数学上应该是相同的:

您生成 2 个随机数并将它们相加。每个数字应介于-maxValue / 2+maxValue / 2之间。这样,总和将是-maxValue+maxValue之间的随机数。

public Double getRandomDouble(double min, double max) {
double halfMin = min/2;
double halfMax = max/2;
double sum = halfMin + (halfMax-halfMin)*Random.nextDouble(); 
return sum + (halfMin + (halfMax-halfMin)*Random.nextDouble());
}

您可以通过绘制两个double随机数来做到这一点。第一个用于确定是要负值还是正值。第二个用于负部分或正部分的实际值。方法将是这样的:

计算从零到上限的范围与从零到下限的范围之间的商。这将为您提供诸如"40% 的值为正,60% 的值为负"之类的信息。使用第一个随机数来检查它是哪个。

然后,当您知道它是负数还是正数时,请使用正态方法获取零和下限/上限之间的随机数。此值只能在0MAX_VALUE(或MIN_VALUE之间(,因此不会有"溢出"。

但是,我不知道在这种情况下的组合概率,如果只绘制一个随机double值时是相同的随机概率。如果您的负/正分割约为 5% 和 95%,那么第二个随机数将被击中 5% 或 95% 之间的值。不确定它是否仍然是"随机的",或者它是否甚至会产生不必要的偏见。

最新更新