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

これは単なるブール論理です。自分で試すことができます。Ran1is 3、Ran2is 4、 is 3 としましょうRan3。式は何に評価されますか?

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

それらはすべて True ではないため、ANDそれらを一緒にすると False になり、ループが壊れます。しかし、それはあなたが望むものではありません。それらがすべて同じである場合にのみ False になりたいのです。お気づきのように、現在の方法では、3 つの変数のいずれかが他の変数と等しい場合にループが中断されます。

二重否定ではなく、肯定的な観点から考える方が簡単です。すべての変数が同じになるのはいつですか? Ran1 == Ran2Java 構文で、Ran1 == Ran3、およびRan2 == Ran3、またはの場合です。

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 || !Cwhileしたがって、上記のループを次のように変えることができます。

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

また:

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

言葉で説明すると、3 つの変数のペアが等しくない限り、ループを継続する必要があります。最初の式は、3 つの変数のすべてのペアが等しくない限り、ループを継続します。Ran1 != Ran2 && Ran1 != Ran3 && Ran2 != Ran3

于 2013-03-19T01:59:11.293 に答える
4

それらがすべて同じになったら、ループを終了します。等式は推移的であるため、 if A == B && B == Cthen A == C. これは、いつでも終了できることを意味します。

Ran1 == Ran2 && Ran1 == Ran3

そのため、前の条件の否定が true になるまでループ内に留まる必要があります。

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

これは、ド・モルガンの法則を使用すると、次のようになります。

Ran1 != Ran2 || Ran1 != Ran3
于 2013-03-19T02:00:39.477 に答える
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 に答える
0

論理的にはあなたのものは問題ありませんが、少し短く/読みやすくすることができます. 条件でNOT 演算子 ( !) を使用する必要があるのは、次のように考えるからです。

while ( !  ( ( Ran1 == Ran2) && (Ran1 == Ran3) ) )
于 2013-03-19T01:55:44.633 に答える