如何在 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。
? 延伸建议:
若后续需频繁调用或处理更大规模数据,可进一步封装为泛型工具类;对于极端性能敏感场景(如每秒百万次调用),可考虑 ThreadLocalR
andom + 原始数组 + 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模板下载网站?
香港服务器网站卡顿?如何解决网络延迟与负载问题?

