递归函数中的错误

时间:2015-09-24 07:34:08

标签: java recursion random

我试图获得一个只有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

5 个答案:

答案 0 :(得分: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()。调用一次并存储结果。

答案 1 :(得分:3)

三件事,以增加迂腐的顺序

  1. 您需要返回递归函数的值:return getRandomPINNumber();否则您将丢弃结果。

  2. 不要多次调用Random randomGenerator = new Random();,否则会破坏生成器的统计属性。将randomGenerator作为班级的字段,或将其传递给您的函数。

  3. 永远不要丢弃随机数生成器的结果,否则会引入一些统计偏差。 (多年来,由于随机数生成器使用不当,很多研究论文被揭穿)。在您的情况下,您可以使用int randomNo = randomGenerator.nextInt(9000) + 1000;并完全放弃丢弃。

答案 2 :(得分:2)

只是一个提示,实际上你不需要在这里使用递归:

    return randomGenerator.nextInt(9000) + 1000;

是一个更简单的解决方案。

答案 3 :(得分:2)

您需要在花括号中的if语句后面包含要处理的代码,并将方法的结果分配给randomNo。

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

您还可以避免&lt; 1000使用

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

这将返回1000到9999之间的数字,并且比递归更清晰。

答案 4 :(得分: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());
    }

}

根据其他答案中的所有信息/提示发布完全无错误的代码