0

0

如何在Java中实现List集合的随机采样_Random类与索引获取

P粉602998670

P粉602998670

发布时间:2026-03-09 12:44:03

|

272人浏览过

|

来源于php中文网

原创

应根据抽样需求选择合适方法:抽1个用nextint安全;抽k个不重复且k远小于列表大小用set去重;k接近列表大小则用collections.shuffle()后截取,但需先拷贝避免修改原集合;多线程高频采样必须用threadlocalrandom.current();务必处理空列表、k≤0、k≥列表长度等边界情况。

如何在java中实现list集合的随机采样_random类与索引获取

RandomList 里抽几个元素,别直接用 nextInt(list.size()) 循环调用

反复调用 nextInt() 取索引再取值,容易重复——尤其当你要抽的个数接近列表长度时。这不是“随机不够好”,而是逻辑没覆盖去重需求。

实操建议:

  • 如果只要抽 1 个:直接 random.nextInt(list.size()) 拿索引,安全
  • 如果要抽 k 个不重复(k 远小于 list 大小):用 Set<integer></integer> 存已选索引,循环直到 size 达标
  • 如果 k 接近 list 大小,或要求高效无重复:改用 Collections.shuffle() 后截取前 k 个——它内部用 Fisher-Yates,O(n) 且均匀

Collections.shuffle() 的坑:别在生产环境对大 List 直接全量打乱

它会原地修改原集合。如果你只是想采样,又得保留原始顺序,那就得先 new ArrayList(original) 拷贝一份——否则后续逻辑可能出错。

性能上,shuffle 是 O(n),但常数不小;若 list 有 100 万元素只抽 10 个,花 50ms 打乱全部再截取,纯属浪费。

立即学习Java免费学习笔记(深入)”;

示例对比:

List<String> src = Arrays.asList("a", "b", "c", "d", "e");
// ✅ 安全:拷贝后 shuffle
List<String> sampled = new ArrayList<>(src);
Collections.shuffle(sampled, random);
sampled = sampled.subList(0, Math.min(3, sampled.size()));

// ❌ 危险:原 list 被改了顺序
Collections.shuffle(src, random); // 后续用 src 的地方全乱了

ThreadLocalRandom 替代共享 Random 实例

多线程环境下,多个线程共用一个 Random 对象,会触发内部 CAS 重试,吞吐下降明显;而 ThreadLocalRandom.current() 每线程独立实例,无竞争。

Papago
Papago

Naver开发的多语言翻译工具

下载

常见错误现象:Random 放在静态字段里被多线程并发调用,压测时采样速率卡在某个平台阈值上,查不出瓶颈。

实操建议:

  • 单线程场景:用普通 RandomThreadLocalRandom 都行
  • 多线程高频采样(如网关日志抽样):必须用 ThreadLocalRandom.current()
  • 别缓存 ThreadLocalRandom 实例——它本就是线程绑定的,每次调用 current() 开销极低

边界情况:空 Listk > list.size()k

这些不是“异常场景”,而是真实业务中会发生的输入——比如上游数据临时为空,或配置采样数写错了。

别依赖抛异常来兜底,应主动判断:

  • list.isEmpty() → 直接返回空 List
  • k → 返回空 <code>List(不是 throw)
  • k >= list.size() → 直接返回原 List 的副本(别 shuffle 全量)

很多人卡在 subList(0, k)IndexOutOfBoundsException,其实就差一行 Math.min(k, list.size())

真正难的不是“怎么随机”,是搞清你要的是“可重复”还是“不可重复”、要不要保持原顺序、有没有并发、输⼊边界是否可控——这些决定了该用哪条路,而不是死记哪个函数名。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

28

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

80

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.2万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号