2011-02-12 8 views
2

このプログラムでは、内側ループは100からの乱数を生成し、 は の乱数が7のときに生成を停止します。外側ループは内側ループを100回繰り返します。
なぜ私の外側のループは内側のループをやり直していませんか?
一度だけしたようです。Javaでネストされたwhileループを学習する

package test; 


public class Loops { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     int i = 0; 
     int sum = 0; 
     int counter = 0; 
     String randomNumberList = " "; 
     int c = 0; 
     while (c != 100){ 

      while (i != 7) { 
      i = (int) (101 * Math.random()); 
      sum += i; 
      ++counter; 
      randomNumberList += " " + i; 
      } 
     System.out.print("\n loop repeated" + counter+ " times and generated these numbers: " + randomNumberList); 
      ++c; 
     } 

    } 

} 
+0

それは私のために何度も走った。私は100行の出力を得ました。あなたはたぶん毎回同じ結果が出ているのだろうか? –

答えて

6

内部ループはi = 7になるまで実行されます。終了した後はまだ7ですので、iを他の値に変更するまでは実行されません。

do-whileループに変更すると、問題が解決されます。

4

あなたが(またはあなたがそれを終了した後。)

このため、第2、および外側ループの次の繰り返しでは、あなたが取得する内部ループを開始する前にiをリセットしないというだけの理由内部whileステートメントですが、条件i != 7はまだfalseであり、内部ループ本体は実行しません。

whileの直前にi = 0を追加するのが簡単な修正です。

より洗練された修正は、whiledo ... whileに変更することです。

0

ベストな修正は、whileループの代わりにforループを使用し、変数の範囲を減らすことです。これは、よりクリーンで慣用コーディングスタイルになり:

import java.util.Random; 

... 

public static void main(String[] args) { 
    Random rand = new Random(); 

    for (int c = 0; c < 100; ++c) { 
     String randomNumberList = " "; 
     int sum = 0; 
     int counter = 0; 
     for (int i = 0; i != 7; ++counter) { 
      i = rand.nextInt(101); 
      sum += i; 
      randomNumberList += " " + i; 
     } 
     System.out.println("loop repeated " + counter+ " times and generated these numbers: " + randomNumberList); 
    } 
} 

上記の変更に関する注意:

  1. あなたは切り捨てループがあなたの変数という事実に起因するバグを隠したことがわかります外側のループに入る前に一度だけ初期化されました。縮小された範囲randomNumberList,sumおよびcounterはこれを修正します。
  2. 一般に、行末には印刷しないでください。特にUnixでは、最後の行を改行で終了しない限り、コマンドプロンプトを最後の出力行の最後に置きます。上記のように、printlnを使用して問題を回避してください。
  3. ゼロから100までの乱数を生成したい場合は、Random.nextInt()は浮動小数点演算と変換なしで同じ結果を達成します。
関連する問題