我想生成一个范围内的随机数,生成的数字不应该在某个范围内发生碰撞 我使用下面的代码,但我得到 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宽度的容器中!
请参阅下图。让我想象我想随机放置这个盒子而不会发生碰撞......我怎么能这样做?
答案 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-50
和temp+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);在循环中?这是无限循环,伙计。而且你永远不会使用方法中的参数。