为什么我的while循环中出现嵌套if语句的无限循环?

时间:2019-06-14 00:21:17

标签: java

我一直在研究一些人以前可能遇到的渗滤问题。您在网格中打开站点,一旦水可以流过连续的打开站点,系统就会渗透。在PercolationStats文件中,创建一个NxN大小的网格并随机打开站点,直到其渗透为止。您存储了渗滤所需的站点数量,然后运行了T次实验。完成所有T实验后,您将输出在网格渗透之前随机打开站点所需的平均次数。

我快完成了,但是现在我的循环卡住了 有趣的是,只有当N> 1时,它才会卡住。如果N = 1,则程序可以正常运行。

我尝试了很多随机的想法,例如更改StdRandom(1,N + 1)或(1,N)内部的输入。我还尝试过在循环内,循环外等之间切换代码行。

    public New_PercolationStats(int N, int T) {
    if (N <= 0 || T <= 0) 
    throw new IllegalArgumentException();
    t = T;
    int sites = 0;
    int open = 0;
    results = new double[t];
    for (int x = 0; x < t; x++) {
        percolation = new New_Percolation(N);
        while(!percolation.percolates()) {
            int i = StdRandom.uniform(0, N);
            int j = StdRandom.uniform(0, N);
            int k = StdRandom.uniform(1, 4);
            open++;

            if (percolation.isOpen(i, j) == false) {
                percolation.open(i, j, k);
                sites++;
            }
        }
        double result = (double) sites / (N * N);
        results[x] = result;
        }
    }

如果站点(i,j)未打开,我希望while循环继续到if语句中,并且我希望通过输入一个介于1到3之间的值k来打开站点(i,j)。但是,当我运行代码时,我一直在运行while循环,并且从未输入if语句。

2 个答案:

答案 0 :(得分:0)

如果卡在while循环中,则问题必须是percolation.percolates()永远不会返回true。要么该方法有问题,要么while循环中的其余代码需要更改未更改的内容。

答案 1 :(得分:0)

感谢大家的反馈。真正的答案是,网格有可能被实际上并没有渗透的数字所填充。假设2x2的网格看起来像这样:

| 1 2 |
| 2 1 |

然后程序将永远不会检测到任何空格,因此它将继续为i,j,k永远生成数字。