我一直在尝试为游戏创建一个掷骰子的类,我的代码就是:
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个不同的数字?
答案 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