我理解Math.random()
本身会生成0.0到1.0之间的随机双精度,包括0.0但不包括1.0。我也明白,转换为int会截断小数点后的所有内容而不进行舍入。
我不明白的是
之类的东西System.out.println((int)(Math.random() * 27));
实际上可以产生一个从0到26的随机数。由于Math.random()
本身只生成0.0到0.9,而9 * 27是24.3,所以上面的代码应该能够生成的最大内容似乎是24.这是如何工作的?
通过搜索答案,我发现有更好的方法来生成随机数,但我正在编写的这本书描述了这种特殊方法,我想了解它是如何工作的。
答案 0 :(得分:17)
Math.random()
的范围不是0.0
到0.9
,而0.0
的范围是尽可能double
小于1.0
, 0.9999999999999999左右。
<强>返回:强>
大于或等于0.0且小于1.0的伪随机双。
如果您将最大可能结果乘以27
并将其截断为int
,则会得到26
。
答案 1 :(得分:4)
由于Math.random()本身只生成0.0到0.9
此声明不正确。 Math.random()
生成[0,1]范围内的随机数。这意味着上限不是0.9 - 它可以产生0.99,0.999,0.9999或任意接近1的任何十进制数。例如,27 * 0.99
是26.73,它被截断为{{ 1}}。
答案 2 :(得分:3)