我试图获得一个只有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 :(得分: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)
三件事,以增加迂腐的顺序
您需要返回递归函数的值:return getRandomPINNumber();
否则您将丢弃结果。
不要多次调用Random randomGenerator = new Random();
,否则会破坏生成器的统计属性。将randomGenerator
作为班级的字段,或将其传递给您的函数。
永远不要丢弃随机数生成器的结果,否则会引入一些统计偏差。 (多年来,由于随机数生成器使用不当,很多研究论文被揭穿)。在您的情况下,您可以使用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());
}
}
根据其他答案中的所有信息/提示发布完全无错误的代码