如何在 Java 中高效生成 10 个不重复的 0 到 20 范围内的随机整数

发布时间 - 2026-01-05 00:00:00    点击率:

本文介绍一种简洁、可靠且性能优良的方法:先构建候选数字列表,再通过随机洗牌(shuffle)从中选取前 10 个元素,彻底避免重复问题。

在 Java 中生成指定范围内无重复的随机整数,最常见误区是使用“随机生成 + 逐个比对”的方式(如原代码中的 do-while 循环),这种方式不仅逻辑复杂、易出错,还存在无限循环风险(尤其当剩余可选数极少时),且仅与前一项比较(list[i] == list[i-1])根本无法检测数组中已存在的其他重复值——这正是示例输出中出现多个 0 和 16 的根本原因。

✅ 推荐方案:Fisher–Yates 洗牌 + 截取(Shuffle & Slice)
该方法基于“均匀随机排列”原理,时间复杂度 O(n),逻辑清晰,100% 无重复,且天然支持任意范围和数量:

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Assignment2_Q2 {
    public static void main(String[] args) {
        int[] myList = generateUniqueRandoms(0, 20, 10); // [min, max] inclusive, count=10
        Arrays.sort(myList);
        System.out.println("The array in sorted order:\n" + Arrays.toString(myList));
    }

    // ✅ 核心方法:生成 [min, max] 内 count 个不重复随机整数
    public static int[] generateUniqueRandoms(int min, int max, int count) {
        if (count > (max - min + 1)) {
            throw new IllegalArgumentException(
                String.format("Cannot select %d unique numbers from range [%d, %d]", 
                              count, min, max));
        }

        // 1. 构建完整候选列表:0, 1, 2, ..., 20 → 共 21 个数
        List candidates = IntStream.rangeClosed(min, max)
                                            .boxed()
                                            .collect(Collectors.toList());

        // 2. 随机打乱顺序(内部使用 Fisher-Yates 算法)
        Collections.shuffle(candidates, new Random()); // 显式传入 Random 更利于测试

        // 3. 取前 count 个,并转为 int[] 数组
        return candidates.subList(0, count).stream()
                         .mapToInt(Integer::intValue)
                         .toArray();
    }
}

? 关键说明与注意事项:

  • IntStream.rangeClosed(min, max) 生成包含边界的整数流(0 到 20 共 21 个数),完美匹配题目要求;
  • Collections.shuffle() 是线程安全、高效且均匀的实现,远优于手写去重逻辑;
  • 显式传入 new Random() 可提升可重现性(如需固定种子,可用 new Random(42));
  • 添加了参数校验:当请求数量超过可用总数时(如要 25 个不重复数但范围只有 21 个),立即抛出异常,避免静默失败;
  • 若需兼容 Java 8 以下版本,可用传统 for 循环填充 ArrayList 替代 IntStream。

? 延伸建议:
若后续需频繁调用或处理更大规模数据,可进一步封装为泛型工具类;对于极端性能敏感场景(如每秒百万次调用),可考虑 ThreadLocalRandom + 原始数组 + Knuth 洗牌优化,但本例中标准库方案已足够健壮高效。

此方法从设计源头杜绝重复,代码简洁可读,是生产环境推荐的标准实践。


# java  # 工具  # ai  # stream  # 排列  # 标准库 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 怎么用AI帮你为初创公司进行市场定位分析?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  详解Android中Activity的四大启动模式实验简述  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  网站制作报价单模板图片,小松挖机官方网站报价?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  香港服务器部署网站为何提示未备案?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  javascript基本数据类型及类型检测常用方法小结  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel如何实现本地化和多语言支持?(i18n教程)  动图在线制作网站有哪些,滑动动图图集怎么做?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何使用Gate和Policy进行授权?(权限控制)  浅析上传头像示例及其注意事项  Laravel如何使用Collections进行数据处理?(实用方法示例)  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何使用Telescope进行调试?(安装和使用教程)  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何快速生成专业多端适配建站电话?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  如何在阿里云完成域名注册与建站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  香港服务器选型指南:免备案配置与高效建站方案解析  如何用美橙互联一键搭建多站合一网站?  UC浏览器如何设置启动页 UC浏览器启动页设置方法  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  微信小程序 wx.uploadFile无法上传解决办法  原生JS获取元素集合的子元素宽度实例  独立制作一个网站多少钱,建立网站需要花多少钱?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  如何快速生成ASP一键建站模板并优化安全性?  深圳网站制作平台,深圳市做网站好的公司有哪些?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?