随机数生成器生成重复项

时间:2017-08-22 10:06:57

标签: java recursion random

框架: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;
    }

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

退货声明应放在何处?

1 个答案:

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

P.S。,最好将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;
    }
}

您可以考虑将buttonIdList更改为HashSet(如果您关心广告订单,则为LinkedHashSet),以便更有效地搜索现有号码。

相关问题