我一直在研究一些人以前可能遇到的渗滤问题。您在网格中打开站点,一旦水可以流过连续的打开站点,系统就会渗透。在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语句。
答案 0 :(得分:0)
如果卡在while
循环中,则问题必须是percolation.percolates()
永远不会返回true。要么该方法有问题,要么while
循环中的其余代码需要更改未更改的内容。
答案 1 :(得分:0)
感谢大家的反馈。真正的答案是,网格有可能被实际上并没有渗透的数字所填充。假设2x2的网格看起来像这样:
| 1 2 |
| 2 1 |
然后程序将永远不会检测到任何空格,因此它将继续为i,j,k永远生成数字。