簡體   English   中英

java錯誤stackoverflow

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM