java错误stackoverflow

时间:2011-10-03 09:36:11

标签: java android stack-overflow

我想生成一个范围内的随机数,生成的数字不应该在某个范围内发生碰撞  我使用下面的代码,但我得到 Stackoverflow 错误..任何更好的解决方案?

static int [] xPositions=new int[10];
int WIDTH=700
public static void main(String args[])throws IOException
{

    if(generateRandomXPositions(10)){
        for(int i=0;i<10;i++){
          System.out.println(" Random Numbers "+i+"  :"+xPositions[i]);
        }
    }


}

private static boolean generateRandomXPositions(int n) {

    for(int i=0;i<10;i++){
        int temp=((int)0 + (int)(Math.random() * ((WIDTH - 0) + 1)));
        for(int j=0;j<xPositions.length;j++){
            if(xPositions[j]>temp-50 && xPositions[j]<temp+50){ // IF GENERATED NUMBER IS IN THIS RANGE IT SHOULD REGENERATE THE NUMBERS 
                generateRandomXPositions(10); 
            }
        }
        xPositions[i]=temp;
    }
    return true;
}

我知道问题在这里

if(xPositions[j]>temp-50 && xPositions[j]<temp+50).   

下面一个正常

`if(xPositions[j]==temp)`.  

但是我需要随机数字应该遵循这个范围!

很多人都在想关于递归循环的退出条件。但我相信如果随机数不在该范围内,则无法进入递归循环。

更新1:

我相信编译器很难找到这个范围之间的数字!现在我发现,在没有碰撞X位置的情况下,不能将宽度为100px的10幅图像放入700px宽度的容器中!

请参阅下图。让我想象我想随机放置这个盒子而不会发生碰撞......我怎么能这样做?

enter image description here

5 个答案:

答案 0 :(得分:4)

由于我认为这是家庭作业而你的问题很模糊,所以尽量自己填写这些方法并将它们结合起来。

public int generateRandom();
public boolean isAccepted(int number);
public void generate();

对于generate(),请使用以下循环:

int temp = generateRandom();
while (!isAccepted(temp)) temp = generateRandom();

答案 1 :(得分:1)

你得到一个StackOverflowError,因为当范围为50时,xPositions[j]>temp-50 && xPositions[j]<temp+50未通过的可能性非常低。由于内部for循环,此函数终止的可能性更低。因此,这将继续递归..

然而,看起来你并没有做你想要实现的目标。如果您要生成全部在设定范围内的数字,则不希望将xPositions[j]temp-50temp+50进行比较。当xPositions[j]不在某个随机范围内时,这将重新生成数字。


如果你真的只想生成一定范围内的数字,那么你就会想要摆脱内部的for-loop,而是做这样的事情:

for every number in xPositions:
  a = random number
  if a is within an unwanted range, regenerate numbers
  else set xPositions[i] = a

或没有递归:

for every number in xPositions:
  a = random number
  while a is within an unwanted range:
    a = random number
  set xPositions[i] = a

另一方面,如果你想沿x轴随机化一些图像的顺序,你可以这样做:

bag = [0 1 2 ... n-1]
shuffle bag
for every number in xPositions:
  xPositions[i] = bag.pop * IMAGE_WIDTH

答案 2 :(得分:0)

在编写递归方法时,您已经犯了经典错误:没有停止条件。

您的方法必须有一个返回false的条件。

答案 3 :(得分:0)

您应该使用循环来创建数字并检查它是否已存在,而不是再次调用generateRandomXPositions()

发生stackOverFlowError是因为你从内部递归调用函数。

答案 4 :(得分:0)

你叫做生成随机位置(10);在循环中?这是无限循环,伙计。而且你永远不会使用方法中的参数。