在Java中获取0到0.06之间的随机数?

15

在Java中如何获取介于0.0和0.06之间的随机Double值?


2
这实际上并不像听起来那么容易。+1 - Michael Myers
2
当您说“between”时,您希望包括端点还是将其排除在可能的返回值之外? - AakashM
1
你应该澄清你想要的是 [0,0.06] 还是 [0,0.06) 中的数字。前者,即区间是闭合的(即端点被包括在内),与后者不同,后者中你永远无法得到 0.06 作为一个值。 - uckelman
3
@AakashM,@uckelman:在这种情况下,这不是相关的,因为0.06无法准确地表示为“double”,因此它永远无法被返回。或者换句话说:他只能达到“[0.0,0.6]”的范围。 - Joachim Sauer
2
@Joachim Sauer:http://babbage.cs.qc.edu/IEEE-754/Decimal.html建议可以这样做,因为它确实可以(它是1.92 / 32,而1.92可以在52位的尾数中精确表示)。 - AakashM
@AakashM:在Java中使用new BigDecimal(double).toString()将为您提供任何double值的精确十进制表示。这将打印出“0.59999999999999997779553950749686919152736663818359375”,这非常接近0.6,但仍然不够准确。 - Joachim Sauer
5个回答

25

nextDouble() 返回一个在0和1之间均匀分布的随机浮点数。只需按以下方式缩放结果:

Random generator = new Random();
double number = generator.nextDouble() * .06;

查看此文档,以获取更多随机数的示例。


2
另外,您可能需要检查数字是否小于0.06,浮点运算不是精确的[在某种意义上,始终存在一些错误/不确定性,这些错误会随着许多浮点运算而积累]。 - Fakrudeen
还要注意不要为每个需要的数字使用一个新的 Random 实例。在这种意义上,uckelman 在下面的回答中更好,因为它特别避免了这种常见错误。 - Joey

7
这将会给你一个在区间[0, 0.06)内的随机双精度数:
double r = Math.random()*0.06;

3
为避免浮点值的不精确性,您可以使用双精度/整数计算,这种方法更加准确(至少在x86 / x64平台上)。
double d = Math.random() * 6 / 100;

1

1

基于此Java文档(但要注意边界条件):

 new Random().nextDouble() * 0.06

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接