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

生成不重复随机数时index++位置引发的程序异常问题排查

问题分析与解决

核心问题

你遇到的问题根本原因不是index++的位置,而是随机数取值范围不足:
你用random.nextInt(9)生成的是0-8的9个不同数字,但需要填充10个位置。当9个数字全部存入数组后,后续生成的所有随机数都会重复,导致程序进入死循环(原代码情况),或者数组无法填满(index++放循环开头的情况)。

两种index++位置的问题详解

  1. index++放在if语句内(你的原代码)
    原代码逻辑本身是合理的:只有生成不重复的数字时,才将其存入数组并推进index。但因为随机数只有9种可能,当index到9时,数组已经存满0-8,后续循环永远生成重复数字,index++永远不会执行,循环无法结束,这就是你觉得“程序无法执行”的原因。

  2. index++放在循环开头
    这种写法下,不管生成的数字是否重复,index都会先自增。如果遇到重复数字,你不会把它存入数组,但index已经变大——这会导致数组中出现空缺(保留初始的-1),同时当index达到10时循环直接结束,根本没机会生成足够的不重复数字,看起来就像“永远不会生成新数字”。

修正方案

方案1:修复原代码的随机数范围

只需要把random.nextInt(9)改成random.nextInt(10),这样就能生成0-9的10个不同数字,原代码逻辑即可正常运行:

private int[] number = new int[] { -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1};
private int index;
private int randomNumber;
private boolean numberRepeated;

Random random = new Random();
index = 0;
while(index < 10) {
    randomNumber = random.nextInt(10); // 修改随机数范围为10
    numberRepeated = false;  
    for(int i = 0 ; i < index; i++) {
        if(number[i] == randomNumber) {
            numberRepeated = true;
            break;
        }
    }
    if(!numberRepeated) {
        number[index] = randomNumber;
        index++;
    }
}

方案2:用HashSet简化逻辑

利用Set自动去重的特性,代码更简洁易读:

private int[] number = new int[10];
Random random = new Random();
Set<Integer> uniqueNumbers = new HashSet<>();

// 生成10个不重复的随机数
while(uniqueNumbers.size() < 10) {
    uniqueNumbers.add(random.nextInt(10));
}

// 将Set中的值转存到数组
int index = 0;
for(Integer num : uniqueNumbers) {
    number[index++] = num;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:50:19