【问题标题】:Learning the nested while loop in Java学习 Java 中的嵌套 while 循环
【发布时间】:2011-06-25 23:55:03
【问题描述】:

在这个程序中,内部循环从 100 个中生成随机数,并且 然后停止生成它们 随机数为 7。外循环重复内循环 100 次。
为什么我的外循环不继续重做内循环?
好像只做了一次。

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

    }

}

【问题讨论】:

  • 它对我来说运行了很多次。我得到了 100 行输出。您是否想知道为什么每次输出都相同?

标签: java loops while-loop


【解决方案1】:

最好的解决方法是使用 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. 如果您想生成介于 0 和 100 之间的随机数,Random.nextInt() 无需浮点数学和转换即可获得相同的结果。

【讨论】:

    【解决方案2】:

    仅仅是因为您没有在开始内部循环之前(或结束之后)重置i

    因此,在外部循环的第二次和后续迭代中,您会到达内部while 语句,但条件i != 7 仍然是false,并且您不执行内部循环体。

    一个简单的解决方法是在内部while 之前立即添加i = 0

    更优雅的解决方法是将内部 while 更改为 do ... while

    【讨论】:

      【解决方案3】:

      内部循环一直运行到 i = 7。它完成后,i 仍然是 7,所以在你将 i 更改为其他值之前它不会再次运行。

      如果您将其更改为 do - while 循环,它应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        相关资源
        最近更新 更多