0

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

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);

}

4

4 回答 4

6

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

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

这些并不都是真的,所以AND把它们放在一起是假的,你的循环会中断。但这不是您想要的,您希望它仅在它们都相同时为 False。如果您注意到,按照您现在的方式,如果三个变量中的任何一个等于其他任何一个,循环就会中断。

从正面而不是双重否定的角度思考更容易。什么时候所有变量都相同?在 Java 语法中是 when Ran1 == Ran2, Ran1 == Ran3, and Ran2 == Ran3, or :

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只要三个变量的所有对不相等,您的初始表达式只会继续循环。

于 2013-03-19T01:59:11.293 回答
4

当它们都相同时,您想退出循环。因为相等是传递的,所以你知道 if A == B && B == Cthen A == C。这意味着您可以在

Ran1 == Ran2 && Ran1 == Ran3

所以你必须保持在循环内,直到前一个条件的否定为真:

! (Ran1 == Ran2 && Ran1 == Ran3)

通过使用德摩根定律,这等效于:

Ran1 != Ran2 || Ran1 != Ran3
于 2013-03-19T02:00:39.477 回答
0

从逻辑上讲,你的很好,但它可能会更短/更容易阅读。您想!在条件中使用 NOT 运算符 ( ),因为这就是您的想法:

while ( !  ( ( Ran1 == Ran2) && (Ran1 == Ran3) ) )
于 2013-03-19T01:55:44.633 回答
0

您想在 3 个值彼此不同的情况下继续迭代,因此表达条件的方式是

while(Ran1 != Ran2 || Ran2 != Ran3 )

因为这意味着一旦将 Ran2 与其他比较,Ran1 和 Ran3 就相等

顺便说一句,您可以简化您的

System.out.print(Ran1);
System.out.print(" ");
System.out.print(Ran2);
System.out.print(" ");
System.out.println(Ran3);

通过使用单个:

System.out.println(Ran1 + " " Ran2 + " " + Ran3);
于 2013-03-19T02:06:12.543 回答