生成0-20的10个不重复随机整数遇重复问题,求代码修复方案
修复0-20之间10个不重复随机整数的Java代码
问题根源
你的代码里,do-while循环只检查了当前生成的随机数和数组前一个元素是否重复,并没有校验它是否和数组中已经存在的所有元素重复,所以会出现多个重复值(比如示例里的0和16)。
修复方案一:数组内全量检查重复
直接修改原number方法,在生成新随机数时,遍历数组中已填充的所有元素,确保没有重复:
import java.util.Arrays; public class Assignment2_Q2 { public static void main (String[] args){ int[] myList = new int[10]; number(myList); sortedOrder(myList); display(myList); } public static void number(int[] list){ int random; // 初始化第一个元素 random = (int)(Math.random() * 21); list[0] = random; for (int i = 1; i < list.length; i++){ boolean isDuplicate; do{ random = (int)(Math.random() * 21); isDuplicate = false; // 遍历已生成的所有元素,检查是否重复 for (int j = 0; j < i; j++){ if (random == list[j]){ isDuplicate = true; break; } } list[i] = random; }while(isDuplicate); // 重复就重新生成 } } public static void sortedOrder(int[] list){ java.util.Arrays.sort(list); } public static void display(int[] list){ System.out.println("The array in the sorted order:\n" + Arrays.toString(list) + "\n"); } }
修复方案二:用HashSet自动去重(更简洁高效)
利用HashSet不允许重复元素的特性,先把随机数存入集合,再转成数组,代码更简洁易读:
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class Assignment2_Q2 { public static void main (String[] args){ int[] myList = generateUniqueRandoms(10, 0, 20); sortedOrder(myList); display(myList); } // 生成指定数量、指定范围的不重复随机数 public static int[] generateUniqueRandoms(int count, int min, int max){ Set<Integer> uniqueSet = new HashSet<>(); // 直到集合里的元素数量达到要求 while(uniqueSet.size() < count){ int random = (int)(Math.random() * (max - min + 1)) + min; uniqueSet.add(random); } // 把集合转成int数组 return uniqueSet.stream().mapToInt(Integer::intValue).toArray(); } public static void sortedOrder(int[] list){ java.util.Arrays.sort(list); } public static void display(int[] list){ System.out.println("The array in the sorted order:\n" + Arrays.toString(list) + "\n"); } }
方案对比
- 方案一:不需要额外引入集合类,直接操作数组,但需要嵌套循环检查重复,当生成数量较多时效率略低。
- 方案二:代码更简洁,利用集合的特性自动去重,效率更高,也更容易维护。
内容的提问来源于stack exchange,提问作者Ikmal Hakimi
相关产品推荐
相关产品推荐

