生成不重复随机数时index++位置引发的程序异常问题排查
问题分析与解决
核心问题
你遇到的问题根本原因不是index++的位置,而是随机数取值范围不足:
你用random.nextInt(9)生成的是0-8的9个不同数字,但需要填充10个位置。当9个数字全部存入数组后,后续生成的所有随机数都会重复,导致程序进入死循环(原代码情况),或者数组无法填满(index++放循环开头的情况)。
两种index++位置的问题详解
index++放在if语句内(你的原代码)
原代码逻辑本身是合理的:只有生成不重复的数字时,才将其存入数组并推进index。但因为随机数只有9种可能,当index到9时,数组已经存满0-8,后续循环永远生成重复数字,index++永远不会执行,循环无法结束,这就是你觉得“程序无法执行”的原因。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
相关产品推荐
相关产品推荐

