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

如何构建元素不重复的随机整数数组?现有Java代码异常排查

问题根因

你的代码存在3个核心错误,直接导致重复输出或无限循环:

  • 循环条件逻辑倒置:isDigitNew返回true代表当前随机数无重复可以使用,但原代码设置为该返回值为true时继续循环重生成,完全违背需求逻辑
  • 重复判断范围错误:isDigitNew遍历了数组全部长度,但数组填充到第i位时,只有下标0~i的位置有有效值,后续位置都是int默认值0,会严重干扰重复判断逻辑
  • 缺少参数校验:你生成的随机数是0~9共10个取值,当入参numOfDigits大于10时,不可能生成无重复数组,必然触发无限循环
修复后代码
private static int[] hiddenSet(int numOfDigits){
    // 先做参数合法性校验
    if (numOfDigits < 1 || numOfDigits > 10) {
        throw new IllegalArgumentException("参数取值范围只能是1~10");
    }
    int[] numArray = new int[numOfDigits];
    int temp;
    for (int i = 0; i < numArray.length;  i++){
        do {
            temp = getRandomNum(10);
            // 只校验已经填充完成的0~i-1位置的数值,避免未初始化的默认值干扰
        } while (!isDigitNew(numArray, i, temp));
        // 确认无重复再赋值到数组
        numArray[i] = temp;
    }
    return numArray;
}

/**
 * 判断当前数值是否未在数组有效范围内出现
 * @param numArray 目标数组
 * @param validLength 数组已经填充的有效长度,仅校验0~validLength-1范围
 * @param num 待判断的随机数
 * @return true代表无重复可以使用,false代表已存在
 */
private static boolean isDigitNew(int[] numArray, int validLength, int num){
    for (int i = 0; i < validLength; i++) {
        if (numArray[i] == num) {
            return false;
        }
    }
    return true;
}
补充优化方案

如果不需要固定用当前写法,更高效的实现方式是先生成0~9的有序列表,直接打乱后截取前numOfDigits位即可,不需要循环校验重复,性能更稳定。


内容的提问来源于stack exchange,提问作者Arenevian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:07