Java Math.random()如何生成超出它的随机数';s";本地的;范围

Java Math.random()如何生成超出它的随机数';s";本地的;范围,java,random,Java,Random,我知道Math.random()本身会生成一个介于0.0和1.0之间的随机双精度,包括0.0,但不包括1.0。我也明白,转换为整数会截断小数点后的所有内容,而不会进行舍入 我不明白的是 System.out.println((int)(Math.random() * 27)); 实际上可以产生一个从0到26的随机数。由于Math.random()本身只能生成0.0到0.9,而9*27是24.3,因此上述代码应该能够生成的最大整数似乎是24。这是怎么回事 通过寻找这个问题的答案,我发现有更好的方

我知道
Math.random()
本身会生成一个介于0.0和1.0之间的随机双精度,包括0.0,但不包括1.0。我也明白,转换为整数会截断小数点后的所有内容,而不会进行舍入

我不明白的是

System.out.println((int)(Math.random() * 27));
实际上可以产生一个从0到26的随机数。由于
Math.random()
本身只能生成0.0到0.9,而9*27是24.3,因此上述代码应该能够生成的最大整数似乎是24。这是怎么回事

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

的范围不是
0.0
0.9
,而是
0.0
到最大可能的
double
小于
1.0
,大约0.99999999999999999左右

返回:

大于或等于0.0且小于1.0的伪随机双精度


如果将可能的最大结果乘以
27
,并通过强制转换为
int
将其截断,您将得到
26
,如果您阅读了
Math.random
的说明,则会出现错误

可以生成的数字介于
0.0
(包含)和
1.0
(排除)之间。但它也可以产生一些
0.99999
ish

由于与
27
相乘,它将给出一个介于
0.0
(包含)和
27
(不包含)之间的数字。因此,可以生成的最大数量为
26.9999999…

在该过程的后面,您将转换为整数:
(int)
。此强制转换采用整体部分,因此尽管结果可以是
26.9999999…
,但使用了
26

最后一点是Java有一个相当不错的类,它提供了一些生成整数的功能。例如,您可以给出最大(独占)编号

因为Math.random()本身只能生成0.0到0.9


这种说法是不正确的。生成范围为的随机数[0,1)。这意味着上限不是0.9-它可以生成0.99、0.999、0.9999或任意接近1的十进制数。例如,
27*0.99
是26.73,它被截断为
26

等等,你说生成0.0和1.0之间的随机双精度,包括0.0,但不包括1.0和Math.random()它本身只产生0.0到0.9。它是哪一个?在
0.9
1.0
之间有很多东西。好吧,0.9不是它产生的最大值。我相信在[0.0,1.0]区间中有2^52(或者可能是2^52+1)个不同的可能数字,
Math.random()
可以生成。哦,老兄,你离最伟大的数字-closer-than-1.0!的实际规范toString表示还差9分之一(确切数字是0.99999999999988897769757537484345957683319091796875)。@yshavit谢谢你指出这一点。我本打算有16个9。更新。