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

时间:2015-01-06 17:03:16

标签: java random

我理解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.这是如何工作的?

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

3 个答案:

答案 0 :(得分:17)

Math.random()的范围不是0.00.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)

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

可生成的数字<{>>介于0.0(含)和1.0(不包括)之间。但它也可以产生0.99999 ish。

由于您与27相乘,因此会为您提供0.0(含)和27之间的数字(不包括)。因此,可生成的最大数量为26.99999999...

在此过程的后期,您将转换为整数:(int)。此强制转换采用整数部分,因此虽然结果可以是26.999999...,但却使用了26

最后一点是 Java 有一个不错的Random类,它提供了一些生成整数的功能。例如nextInt,您可以在其中提供最大(不包括)数字。