Math.random() 如何生成超出其 "native" 范围的随机数?

How does Math.random() generate random numbers beyond it's "native" range?

我知道 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,看起来上面的代码应该是最大的整数produce 是 24。这是如何工作的?

通过搜索这个问题的答案,我发现有更好的方法来生成随机数,但我正在阅读的书描述了这种特殊方法,我想了解它是如何工作的。

Math.random() 的范围不是 0.00.9,它是 0.0 到最大可能的 double 小于 1.0 ,大约0.9999999999999999左右。

Returns:

a pseudorandom double greater than or equal to 0.0 and less than 1.0.

如果您将可能的最大结果乘以 27 并通过强制转换为 int 将其截断,您将得到 26.

您阅读 Math.random 的规格有误。

可生成的数字在0.0(含)和1.0(不含)之间。但它也可以产生一些 0.99999 左右的东西。

因为你乘以 27 它会给你一个介于 0.0(含)和 27(不含)之间的数字。因此,可以生成的最大数量是 26.99999999....

稍后,您将转换为一个整数:(int)。此转换 取整数部分 ,因此虽然结果可以是 26.999999...,但使用 26

最后要说的是 Java 有一个不错的 Random class, that provides some functionality to generate integer numbers. For instance nextInt 在那里你可以给出最大(独占)数量。

Since Math.random() by itself only produces 0.0 through 0.9

此说法不正确。 Math.random() 产生 [0, 1) 范围内的随机数。这意味着上限不是 0.9 - 它可以产生 0.99、0.999、0.9999 或任意接近 1 的任何十进制数。举个例子,27 * 0.99 是 26.73,它被截断为 26.