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

生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:40:16