所以我有一个数组Canvas [256] [256],它有一个随机索引Canvas [r] [r](r是随机的)设置为1.然后我想循环遍历数组,看看究竟是哪个索引是不是0,然后选择一个随机点(上,下,左,右)并将其设置为1。它通过第一个循环完美地工作,但之后给我一个数组越界错误。
public static void checkPopulation() {
for(int x = 0; x < Canvas.length; x++) {
for(int y = 0; y < Canvas.length; y++) {
if(Canvas[x][y] != 0) {
particleDiffusion(x, y);
}
}
}
}
public static void particleDiffusion(int x, int y) {
Random r = new Random();
if(r.nextInt(3) == 0) {
Canvas[x+1][y] = 255;
} else if(r.nextInt(3) == 1) {
Canvas[x][y+1] = 255;
} else if(r.nextInt(3) == 2) {
Canvas[x-1][y] = 255;//THIS IS WHERE ERROR IS POINTING
} else if(r.nextInt(3) == 3) {
Canvas[x][y-1] = 255;
}
if(stepsTaken < diffusionStep) {
checkPopulation();
} else {
System.out.println("done");
return;
}
}
有人可以帮我解决我做错的事吗?为什么它循环一次然后给出错误?
答案 0 :(得分:5)
你检查x和y是否小于Canvas.length,然后使用x + 1和y + 1作为数组索引,这就是原因。固定代码如下。
public static void checkPopulation() {
for(int x = 0; x < Canvas.length; x++) {
for(int y = 0; y < Canvas.length; y++) {
if(Canvas[x][y] != 0) {
particleDiffusion(x, y);
}
}
}
}
public static void particleDiffusion(int x, int y) {
Random r = new Random();
if(r.nextInt(3) == 0) {
if( x+1 < Canvas.length)
Canvas[x+1][y] = 255;
} else if(r.nextInt(3) == 1) {
if( y+1 < Canvas.length)
Canvas[x][y+1] = 255;
} else if(r.nextInt(3) == 2) {
if( x > 0)
Canvas[x-1][y] = 255;//THIS IS WHERE ERROR IS POINTING
} else if(r.nextInt(3) == 3) {
if( y > 0)
Canvas[x][y-1] = 255;
}
if(stepsTaken < diffusionStep) {
checkPopulation();
} else {
System.out.println("done");
return;
}
}
编辑:你也应该检查x-1和y-1不是负面的。
答案 1 :(得分:2)
好的,让我们一个接一个地解决你所有的问题。
指数。这很明显,我不会进一步讨论。
checkPopulation()
和particleDiffusion()
以递归方式互相调用。由于在代码路径中未修改stepsTaken
或diffusionStep
,因此最终会看到StackOverflow。您似乎不需要为此使用递归,为什么不使用循环呢?我假设您有checkPopulation()
的初始通话,那么如何更换它:
for (int stepsTaken = 0; stepsTaken < diffusionStep; stepsTaken++) {
checkPopulation();
}
现在,在高级别,您的方法看起来像
main() {
checkPopulation();
}
checkPopulation() {
...
particleDiffusion();
}
particleDiffusion() {
...
if (stepsTaken < diffusionStep) {
checkPopulation();
}
}
随着更改,它现在看起来像
main() {
for (int stepsTaken = 0; stepsTaken < diffusionStep; stepsTaken++) {
checkPopulation();
}
}
checkPopulation() {
...
particleDiffusion();
}
particleDiffusion() {
...
}
多次调用r.nextInt(3) == x
不会均匀分布四个方向的概率。我们无法保证这四种情况中的任何一种都能成功。将r.nextInt(3)
的结果保存在变量中,然后对该变量进行比较。