这是错的吗?当Ran1,Ran2,Ran3都相同时,我想退出while循环。 n

Random RandomNumber = new Random();
int Ran1 = RandomNumber.nextInt(4);
int Ran2 = RandomNumber.nextInt(4);
int Ran3 = RandomNumber.nextInt(4);

while (Ran1 != Ran2 && Ran1 != Ran3 && Ran2 != Ran3 ){
    Ran1 = RandomNumber.nextInt(4);
    Ran2 = RandomNumber.nextInt(4);
    Ran3 = RandomNumber.nextInt(4);
    System.out.print(Ran1);
    System.out.print(" ");
    System.out.print(Ran2);
    System.out.print(" ");
    System.out.println(Ran3);


}

最佳答案

这只是简单的布尔逻辑。您可以自己尝试。假设Ran1是3,Ran2是4,Ran3是3。该表达式的计算结果是什么?

Ran1 != Ran2 -> 3 != 4 -> True
Ran1 != Ran3 -> 3 != 3 -> False
Ran2 != Ran3 -> 4 != 3 -> True


这些都不都是True,因此将它们一起AND是False,并且循环会中断。但这不是您想要的,您只希望它们相同时才为False。如果您注意到,便是现在拥有的方式,如果三个变量中的任何一个等于其他任何一个,循环就会中断。

从肯定而不是双重否定的角度更容易思考。什么时候所有变量都相同?在Ran1 == Ran2Ran1 == Ran3Ran2 == Ran3或Java语法中:

Ran1 == Ran2 && Ran1 == Ran3 && Ran2 == Ran3


现在,只要这不是真的,就希望循环继续进行,因此请确保将其包装在括号中并使用NOT运算符!

while (!(Ran1 == Ran2 && Ran1 == Ran3 && Ran2 == Ran3)) {
    ...
}




就是这样,但是如果您不想使用括号,则可以使用布尔逻辑简单地表达。 !(A && B)!A || !B相同:

A  |  B  |  A && B  |  ! (A && B)  | !A  |  !B  |  !A || !B
---+-----+----------+--------------+-----+------+-----------
T  |  T  |    T     |       F      |  F  |   F  |     F
T  |  F  |    F     |       T      |  F  |   T  |     T
F  |  T  |    F     |       T      |  T  |   F  |     T
F  |  F  |    F     |       T      |  T  |   T  |     T


您可以自己验证!(A && B && C)!A || !B || !C相同。因此,您可以将上述while循环转换为:

while (!(Ran1 == Ran2) || !(Ran1 == Ran3) || !(Ran2 == Ran3)) {
    ...
}


要么:

while (Ran1 != Ran2 || Ran1 != Ran3 || Ran2 != Ran3) {
    ...
}


就用词进行推理而言:只要三个变量中的任何一对都不相等,就希望循环继续进行。只要三个变量的所有对都不相等,初始表达式Ran1 != Ran2 && Ran1 != Ran3 && Ran2 != Ran3就只会继续循环。

08-25 01:59