[英]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.