类型转换 Math.random?

4

在这个网站上看了一下问题,没有找到有关将double类型的Math.random()方法强制转换为int类型的答案。

我的问题是,为什么不带括号的Math.random只返回0,但当它包含在括号中时,它会返回随机数字?

代码的第一部分返回0:

int number; 
number = (int) Math.random() * 10; 
System.out.println("\nThe random number is " + number);

这段代码是可行的:

int number; 
number = (int) (Math.random() * 10); 
System.out.println("\nThe random number is " + number);

需要注意的是,在类型转换方面,我看到了一些不同的代码片段,其中一些程序员似乎使用两种方式进行转换。


1
使用java.util.Random而不是Math.random有几个优点。它允许强制种子,这对于测试和调试非常重要。它具有一个nextInt(int)方法,可以更直接地实现你想要的功能。 - Patricia Shanahan
我实际上在另一个 SO 问题上读到了这个,但我只是在跟随 Oracle Java 课程的教程,其中 Math.Random 被用作例子。我个人使用你提到的方法,不过我并不太理解强制种子在测试中的好处。 - wilbomc
1
种子是告诉随机数生成器在其数字序列中从哪里开始的参数。如果它基于时间,那么如果失败路径取决于随机数,可能会出现无法重现测试失败的问题。java.util.Random有一个构造函数,可以让您指定一个种子。使用相同的种子启动它,您将从中获得相同的数字序列。 - Patricia Shanahan
2个回答

7
这段代码:
number = (int) Math.random() * 10; 

首先计算这个:
(int) Math.random()

由于Math.random()返回的是0到1之间的数,但不包括1,如果你将它转换成整数,它会向下取整为0。那么当你将0乘以10时,得到的结果是0。


@Hovercraft 所以将 Math.Random 放在括号中首先计算随机数,然后进行类型转换?所以如果随机数是0.5,0.5 x 10 将得到 5,然后它将被强制转换为 int,同时不会通过截断丢失任何关键的小数值? - wilbomc

1

Math.random()返回0到1之间的数字。您希望将(Math.random()*10)的结果转换为整数,而不是从Math.random本身获得的数字。数字被向下舍入。因此,例如,可以从Math.random中获得0.3,它会被舍入为0。同样,您希望舍入0.3乘以10的结果,即3。括号很重要。


啊,我明白了。所以括号基本上告诉编译器将Math.random的存储结果强制转换而不是它生成的数字?这对我来说都很新,因为我之前认为括号只用于参数或算术优先级顺序。 - wilbomc

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