如何构建元素不重复的随机整数数组?现有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
相关产品推荐
相关产品推荐

