2015-09-24 4 views
4

Я пытаюсь получить номер булавки всего 4 цифры. Но цифры, которые меньше 1000, также печатаются. Что происходит в этом коде?Ошибка в рекурсивной функции

import java.util.Random; 

public class Util { 

    public static int getRandomPINNumber(){ 
     Random randomGenerator = new Random(); 
     int randomNo = randomGenerator.nextInt(10000); 
     if(randomNo < 1000) 
     getRandomPINNumber(); //repeat if it is less than 1000,some bug here 
     return randomNo; 
    } 

    public static void main(String[] args){ 
     for(int i = 0;i<100; i++) 
      System.out.println(getRandomPINNumber()); 
    } 

} 

Выход

6413 
1692 
5734 
105 <--- why 105 is getting printed, it should reevaluate the pin right? 
4857 
6348 
1355 
+0

У вас есть конкретные причины, чтобы сделать это рекурсивно, а не просто используя цикл while? – Manu

+0

Нет, совсем нет. Я поеду с батшбаем 3 балла в его ответе. Получил прохладный совет – Keerthivasan

+0

Не 0001 действительный PIN-код? :) –

ответ

8

Проблема заключается в том, что вы не возвращает результат рекурсивного вызова. Изменение вам код:

public static int getRandomPINNumber(){ 
    Random randomGenerator = new Random(); 
    int randomNo = randomGenerator.nextInt(10000); 
    if(randomNo < 1000) 
     return getRandomPINNumber(); //repeat if it is less than 1000 
    return randomNo; 
} 

При вызове функции в первый раз и число меньше 1000 генерируется, вы рекурсивный вызов getRandomPINNumber но игнорировать возвращаемое значение.

Кроме того, вы не должны называть new Random() несколько раз. Вызовите его один раз и сохраните результат.

+0

Вы можете удалить «некоторые ошибки здесь» :-) – Manu

+0

Плюс один за упоминание множественного вызова 'Random()'. Если бы у меня был доллар за каждый случай, я заметил это ... – Bathsheba

+0

Спасибо, я глупо об этом .. Большое спасибо .. Я сделаю создание случайного экземпляра один раз .. – Keerthivasan

3

Три вещи, в порядке возрастания педантичность

  1. Вы должны вернуть значение рекурсивной функции: return getRandomPINNumber(); еще вы отбрасывая результат.

  2. Не звоните Random randomGenerator = new Random(); несколько раз, иначе вы разрушаете статистические свойства генератора. У вас есть randomGenerator как поле вашего класса или передайте его вашей функции.

  3. Никогда не отбрасывайте результаты генератора случайных чисел, иначе вы введете некоторый статистический уклон. (В течение многих лет очень много исследований были развенчаны из-за неправильного использования генератора случайных чисел). В вашем случае вы можете использовать int randomNo = randomGenerator.nextInt(9000) + 1000; и вообще отказаться от отбрасывания.

+0

Можете ли вы подробно остановиться на/ссылка на объяснение того, как регенерировать все значения ниже 1000, вводит статистическое смещение здесь? – Keppil

+1

Обход вокруг Google-статистического смещения в линейных конгруэнтных генераторах. Я думаю, что Numericical Recipes In C также содержит разделы. Короче говоря, вы увеличите свою дисперсию (и более высокие моменты), что означает, что ваш образец может не дать критерия хи-квадрат для единообразия. – Bathsheba

2

Только намек, на самом деле вам не нужно использовать рекурсию здесь:

return randomGenerator.nextInt(9000) + 1000; 

является гораздо более простым решением.

2

Вы должны приложить код, который хотите обработать после инструкции if в фигурных скобках, и назначить результат метода случайному.

int randomNo = randomGenerator.nextInt(10000); 
if (randomNo < 1000) { 
    randomNo = getRandomPINNumber(); //repeat if it is less than 1000,some bug here 
} 
return randomNo; 

Можно также избежать значения, < 1000 с помощью

int randomNo = randomGenerator.nextInt(9000) + 1000; 

Это возвратит число от 1000 до 9999 и является гораздо чище, чем решение рекурсии.

0

Я сделал код этим путем,

public class Util { 

    static Random randomGenerator = new Random(); 

    public static int getRandomPINNumber(){ 
     int randomNo = randomGenerator.nextInt(9000) + 1000; 
     return randomNo; 
    } 


    public static void main(String[] args){ 
     for(int i = 0;i<100; i++) 
      System.out.println(getRandomPINNumber()); 
    } 

} 

Проводка полностью Буг кода следующего всей информации/советы от других ответов

Смежные вопросы