我是编程新手,并希望用Java编写一个骰子滚动程序来执行。 代码如下:
import java.math.*;
public class Dices {
public static int dice1=0;
public static int dice2=0;
public static int x;
public static void main(String args[]){
do {
x++;
dice1=(int) (Math.random()*6+1);
dice2=(int) (Math.random()*6+1);
System.out.println(dice1+", "+dice2);
} while(dice1 !=1 || dice2 !=1);
System.out.println("Finalthrow: "+dice1+", "+dice2);
System.out.println("Snake-Eyes after "+x+" tries.");
}
}
这种方式工作正常,但在我看来代码有问题。实际上应该是while
条件。但是如果我使用&&
,它会在第一个骰子上滚动1时立即停止。我认为&&
意味着" AND"而||
表示"或"。所以实际上它应该完全相反,或者我误解了什么?
答案 0 :(得分:3)
对Morgan's laws的一些理解可能对此有所帮助。法律说(对不起奇怪的语法,但我认为信息很清楚):
(!P) OR (!Q) == !(P AND Q)
(!P) AND (!Q) == !(P OR Q)
所以当您在条件
中使用||
(OR)时
while(dice1 !=1 || dice2 !=1)
与
完全相同while(!(dice1 == 1 && dice2 == 1))
所以它会在两个骰子都为1
之前徘徊。
另一方面,如果您使用 &&
(AND):
while(dice1 !=1 && dice2 !=1)
与
相同while(!(dice1 == 1 || dice2 == 1))
所以这意味着它将循环直到一个或两个的骰子为1
。
答案 1 :(得分:0)
&& means and
|| means or
所以(dice1!= 1 || dice2!= 1)表示继续循环,而dice1不是1或骰子2不是1.
所以(dice1!= 1&& dice2!= 1)表示继续循环,而dice1不是1,而骰子2不是1.
答案 2 :(得分:0)
代码很好。您希望循环在dice1 == 1
和dice2 == 1
时结束。所以它必须循环直到这是真的,或者直到它的反面都是假的。与dice1 == 1 && dice2 == 1
相反的是!(dice1 == 1 && dice2 == 1)
,相当于dice1 != 1 || dice2 != 1
。
以这种方式思考:如果dice1 != 1
,请继续循环。此外,如果dice2 != 1
,请继续循环。因此,如果其中任何一个为真,请保持循环。要测试 是否为真,无论两者是否为真,请使用||
。
答案 3 :(得分:0)
行为是正确的。你用dice1 !=1 && dice2 !=1
说重复loopuntil骰子的两个不是1.但是当一个骰子滚动1时,条件为假并且循环逃脱。尝试使用真值表。
答案 4 :(得分:0)
让我们制作一个真值表。
我们可以从中得出什么结论?如果您希望循环继续,而 A
或B
与1
不同(或者,正如De Morgan的法律所述:直到它们都等于1
),然后你可以将它缩小到这些值:
由于我们需要找到允许我们继续循环的运算符(又名:条件为true
),我们将为所有3种不同类型的输入获取返回true
的列,是A || B
。
请注意,A && B
和A || B
是指A != 1
和B != 1
的结果,而不是实际输入。