ошибка переполнения стека Java - PullRequest
2 голосов
/ 03 октября 2011

Я хочу генерировать случайные числа в пределах диапазона, и сгенерированные числа не должны сталкиваться в некотором диапазоне.
Я использовал следующий код, но я получаю 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 изображений шириной 100 пикселей каждое в контейнер шириной 700 пикселей, не сталкивая позиции X!

Пожалуйста, смотрите изображение ниже.Давайте представим, что я хочу разместить эти ящики случайно, не сталкиваясь ... как я могу это сделать?

enter image description here

Ответы [ 5 ]

4 голосов
/ 03 октября 2011

Поскольку я считаю, что это домашнее задание, а ваш вопрос довольно расплывчатый, попробуйте заполнить эти методы самостоятельно и объединить их разумно.

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

Для generate() используйте цикл вроде:

int temp = generateRandom();
while (!isAccepted(temp)) temp = generateRandom();
1 голос
/ 03 октября 2011

Вы получаете StackOverflowError, потому что вероятность того, что xPositions[j]>temp-50 && xPositions[j]<temp+50 не пройдет, очень мала, когда есть диапазон 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
0 голосов
/ 03 октября 2011

Вместо повторного вызова generateRandomXPositions() следует использовать цикл для создания номера и проверки, существует ли он уже или нет.

StackOverFlowError возникает из-за того, что вы рекурсивно вызываете функцию из себя.

0 голосов
/ 03 октября 2011

Вы вызвали generateRandomXPositions (10);внутри петли?Это бесконечный цикл, чувак.И вы никогда не используете параметр из метода.

0 голосов
/ 03 октября 2011

Вы допустили классическую ошибку при написании рекурсивных методов: нет условия остановки.

Ваш метод должен иметь одно условие, которое возвращает false.

...