You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11中ArrayList随机不重复数字添加失败问题求助

问题分析与解决方案

你的代码在实现「仅添加不重复随机数」的逻辑时存在几个关键漏洞,导致重复数字依然会被加入列表。我来一步步拆解问题,再给出修复方案:

核心问题拆解

  • 每次递归新建Random实例:new Random().nextInt(5)会在每次调用方法时创建新的随机数生成器。短时间内多次递归调用时,由于默认种子依赖系统当前时间,很可能生成完全相同的随机数,这本身就埋下了重复隐患。
  • 重复检查后的逻辑错误:当发现randomPosition已存在于列表时,你递归调用了addToListNumber(),但递归返回后,原代码依然会执行list.add(randomPosition)——也就是说,那个重复的数字还是会被强行加入列表!
  • 递归的潜在风险:用递归实现循环填充逻辑,当maxPosition数值较大时,容易触发栈溢出错误。

修复后的代码示例(推荐用循环实现)

// 将Random实例设为类成员,复用同一个生成器保证随机性
private Random random = new Random();
private List<Integer> list = new ArrayList<>();
private int maxPosition = 5;

private void addToListNumber() {
    // 列表未满时持续生成并添加不重复的随机数
    while (list.size() < maxPosition) {
        int randomPosition = random.nextInt(5);
        // 仅当数字不存在时才添加
        if (!list.contains(randomPosition)) {
            list.add(randomPosition);
        }
    }
    // 列表填满后打印结果
    for (Integer integer : list) {
        System.out.println(integer);
    }
}

若坚持用递归实现(不推荐,仅作演示)

如果一定要保留递归逻辑,需要调整流程,确保发现重复时直接跳过当前的添加操作:

private Random random = new Random();
private List<Integer> list = new ArrayList<>();
private int maxPosition = 5;

private void addToListNumber() {
    // 终止条件:列表已满则打印并返回
    if (list.size() >= maxPosition) {
        for (Integer integer : list) {
            System.out.println(integer);
        }
        return;
    }

    int randomPosition = random.nextInt(5);
    // 数字已存在,直接递归重新生成,不执行后续添加
    if (list.contains(randomPosition)) {
        addToListNumber();
        return;
    }

    // 数字不存在时才添加并继续递归
    list.add(randomPosition);
    addToListNumber();
}

这样修改后,就能确保列表中不会出现重复的随机数字了。

内容的提问来源于stack exchange,提问作者Paweł Buczek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:32:51