2011-02-12 132 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行輸出。你是否想知道爲什麼每次輸出都是一樣的? – 2011-02-12 07:06:02

回答

6

內循環運行,直到i = 7。完成後,我仍然是7,所以它不會再運行,直到您將我更改爲其他值。

如果將其更改爲do-while循環,則應清除問題。

4

很簡單,因爲你不復位i啓動內循環(或者你結束之後。)

因此,在第二和外部循環的後續迭代,你去之前內部的while聲明,但條件i != 7仍然是false,並且您不執行內部循環體。

一個簡單的解決方法是在內部while之前立即添加i = 0

更優雅的修復方法是將內部while更改爲do ... while

0

最好的解決方法是使用for循環代替while循環,並減少變量的範圍。這導致一個更清潔,更地道的編碼風格:

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. 你會發現,截斷環躲在造成事實上的錯誤,你的變量在進入外循環之前僅被初始化一次。 randomNumberListsumcounter的縮小範圍解決了此問題。
  2. 通常最好在行的末尾打印\n,而不是在開頭,特別是在Unix上,它將命令提示符放在輸出的最後一行的末尾,除非您用換行符終止最後一行。更好的是,通過使用println,完全避免這個問題,如上所示。
  3. 如果要生成零和100之間的隨機數,則Random.nextInt()在沒有浮點數學運算和轉換的情況下可以實現相同的結果。