为什么我的类中我的math.random实现只返回0?

时间:2018-02-08 08:46:45

标签: java

我一直在尝试为游戏创建一个掷骰子的类,我的代码就是:

public int[] yahtzeeRoll() {
    int[] rolls1 = new int[6];
    for (int i = 0; i < 6; i++) {
        rolls1[i] = ((int) Math.random()*6+1);
    }
    return rolls1;
}

然而,当我在main方法中调用它时,它只为每个值返回1。为什么是这样?当我在main方法中打印数组时,如何修复代码以便生成6个不同的数字?

6 个答案:

答案 0 :(得分:1)

您将double返回的Math.random()值转换为int,然后乘以6,并且Math.random()返回一个值&lt; 1,将其投放到int会产生0

更改

rolls1[i] = ((int) Math.random()*6+1);

rolls1[i] = (int)(Math.random()*6)+1;

答案 1 :(得分:0)

通过附加(type)进行类型转换优先于* 6位。因此,Math.random()的结果总是在将它乘以6之前被转换为0,结果总是为0。

This answer指向this site,这很好地解释了它。

(int) (Math.random() * 6) + 1(int) (Math.random() * 6 + 1)可以按预期工作。

答案 2 :(得分:0)

Math.random返回0到1之间的浮点数,但是在它之前使用(int)类型转换将其截断为0。如果你希望使用整数截断,请在表达式周围使用括号,然后在(int)之前添加括号。

顺便说一句,我认为如果你没有为伪随机引擎播种,那么应该在每次运行时生成相同的序列,比如当前时间或其他东西。

答案 3 :(得分:0)

Math.random()返回范围[0,1]中的double值(大于或等于0.0且小于1.0)。然后你将double值转换为int,因此它总是得到0.之后你加1,所以结果总是保持为1。

您应该投射乘法结果 - Math.random() * 6而不是投射Math.random()返回值:

rolls1[i] = (int)(Math.random()*6)+1;

顺便说一下,您应该了解Java语言中的运算符优先级。你可以看一下这里:operator precedence看到漂亮的表,表明铸造的优先级高于乘法和加法 - 这就是为什么(Math.random()*6)放在括号中进行铸造的原因(这样你避免仅投射Math.random()

PS。还有table of operator precedence in official Java tutorial的链接,但它并不完全适合您的问题,因为它不包含强制转换操作 - 这就是为什么我首先提供了另一个链接的原因。

答案 4 :(得分:0)

让我们看看表达式。

((int) Math.random()*6+1)

现在Math.random()会返回double>=0的{​​{1}}。

然后,您将该结果投射到<1,这意味着它将永远变为int

如果你使用。

0

您在(int)(Math.random()*6+1) double之间取0,将其乘以1(给6)加0 ... 6然后再投到1。这看起来更像你正在寻找的东西。

答案 5 :(得分:0)

您可以从下面的输出演示中找到线索,这是自我解释的。 代码:

double random = Math.random();
System.out.println("Math.random()>>"+random);
System.out.println("Math.random()*6>>"+random*6);
System.out.println("(int)(Math.random()*6)>>"+(int)(random*6));
System.out.println("Math.random()*6+1>>"+random*6+1);   //+1 here is treated as a string by java and will add at the end of the number
System.out.println("(Math.random()*6+1)>>"+(random*6+1));   //number random*6 will be incremented by 1 as enclosing () will treat them as numbers
System.out.println("(int)(Math.random()*6+1)>>"+(int)(random*6+1));

输出:

Math.random()>>0.6793602796545469
Math.random()*6>>4.076161677927281
(int)(Math.random()*6)>>4
Math.random()*6+1>>4.0761616779272811
(Math.random()*6+1)>>5.076161677927281
(int)(Math.random()*6+1)>>5