[英]java error stackoverflow
我想生成一个范围内的随机数,并且生成的数字不应在某个范围内冲突。
我用下面的代码,但我得到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:
而且我相信编译器会很累地找到这个范围之间的数字! 现在,我发现不可能将10个宽度均为100px的图像装入700px宽度的容器中而不会碰撞X位置!
请参见下图。 假设我想将这个盒子随机放置而不发生碰撞...我该怎么做?
由于我认为这是家庭作业,并且您的问题很模糊,因此请尝试自己填写这些方法并将它们巧妙地结合起来。
public int generateRandom();
public boolean isAccepted(int number);
public void generate();
对于generate()
,请使用类似以下的循环:
int temp = generateRandom();
while (!isAccepted(temp)) temp = generateRandom();
之所以收到StackOverflowError
是因为当范围为50时xPositions[j]>temp-50 && xPositions[j]<temp+50
不通过的可能性非常低。由于以下原因,该函数终止的可能性甚至更低内部for循环。 因此,这将继续递归。
但是,您似乎并没有在做您真正想要完成的事情。 如果要生成均在设定范围内的数字,则不想将xPositions[j]
与temp-50
和temp+50
。 当xPositions[j]
不在某个随机范围内时,这将重新生成数字。
如果您真的只想生成一定范围内的数字,那么您将希望摆脱内部for循环,而应执行以下操作:
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
在编写递归方法时,您犯了经典错误:没有停止条件。
您的方法必须具有一个返回false的条件。
而不是再次调用generateRandomXPositions()
,您应该使用循环来创建数字并检查数字是否已经存在。
发生stackOverFlowError是因为您从自身内部递归调用了该函数。
您调用了generateRandomXPositions(10); 循环内? 这是无限循环,伙计。 而且您永远不会使用方法中的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.