随机数生成器生成重复项

cod*_*ess 0 java random recursion

框架:Java

public static List<Integer> buttonIdList = new ArrayList();

public void myMainMethod() {
   for(Integer i = 0; i < 11; i++) {
      int randomButtonId = getUniqueIdNumber();
   }
}

private static Integer getUniqueIdNumber() {
        Random ran = new Random();
        int randomButtonId = ran.nextInt(20) + 1;

        if(buttonIdList.contains(randomButtonId)) {
            getUniqueIdNumber();
        } else {
            buttonIdList.add(randomButtonId);
        }

        return randomButtonId;
    }
Run Code Online (Sandbox Code Playgroud)

当代码遇到重复时,它会自动调用(递归),在第二次尝试时,如果数字是唯一的,则return语句将其返回给myMainMethod或getUniqueIdNUmber?

退货声明应该放在哪里?

Era*_*ran 7

您应该返回递归调用的结果:

private static Integer getUniqueIdNumber() {
    Random ran = new Random();
    int randomButtonId = ran.nextInt(20) + 1;

    if(buttonIdList.contains(randomButtonId)) {
        return getUniqueIdNumber();
    } else {
        buttonIdList.add(randomButtonId);
    }

    return randomButtonId;
}
Run Code Online (Sandbox Code Playgroud)

PS,这将是更好地使Random ran一个static而不是创建一个新的变量Random在每次递归调用实例.

private static Random ran = new Random();
private static Integer getUniqueIdNumber() {
    int randomButtonId = ran.nextInt(20) + 1;
    if(buttonIdList.contains(randomButtonId)) {
        return getUniqueIdNumber();
    } else {
        buttonIdList.add(randomButtonId);
        return randomButtonId;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以考虑更改buttonIdListHashSet(或者LinkedHashSet如果您关心插入顺序),以便更有效地搜索现有数字.