Java中的Collections.shuffle()方法及示例

简介: `Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。

Collections.shuffle() 方法详解

  1. 方法签名

public static void shuffle(List<?> list)
php
40 Bytes
© 菜鸟-创作你的创作
参数:list — 要打乱顺序的 List 集合。
返回值:该方法没有返回值,它会直接修改传入的列表(即原地修改)。

  1. 方法原理

Collections.shuffle() 方法通过使用 java.util.Random 进行随机排列,它的实现使用了 Fisher-Yates 洗牌算法,该算法是一种高效且公平的随机排序算法,能够保证每种可能的排列都具有相同的概率。

  1. 可选参数:自定义 Random 对象

shuffle() 方法还可以接收一个自定义的 Random 对象,允许我们指定随机数生成器的种子,这样可以保证每次运行时生成相同的随机顺序(即可重复性)。

public static void shuffle(List<?> list, Random rnd)
php
52 Bytes
© 菜鸟-创作你的创作
参数:
list — 要打乱顺序的 List 集合。
rnd — 自定义的 Random 对象,用于生成随机数。
示例 1:基本使用 Collections.shuffle()

import java.util.*;
public class ShuffleExample {
public static void main(String[] args) {
// 创建一个包含 1 到 10 的列表
List numbers = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
numbers.add(i);
}
// 打印原始列表
System.out.println("原始列表: " + numbers);
// 使用 shuffle 方法打乱列表顺序
Collections.shuffle(numbers);
// 打印打乱后的列表
System.out.println("打乱后的列表: " + numbers);
}
}
php
469 Bytes
© 菜鸟-创作你的创作
输出:

原始列表: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
打乱后的列表: [6, 4, 1, 9, 7, 8, 2, 3, 10, 5]
php
77 Bytes
© 菜鸟-创作你的创作
说明:

每次执行 Collections.shuffle() 时,打乱的顺序都会不同。

示例 2:使用自定义的 Random 对象

通过传递一个自定义的 Random 对象,可以确保每次运行时使用相同的随机顺序(可重复性)。

import java.util.*;
public class ShuffleWithRandom {
public static void main(String[] args) {
// 创建一个包含 1 到 10 的列表
List numbers = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
numbers.add(i);
}
// 创建一个随机数生成器并设置种子
Random random = new Random(42); // 固定种子,保证每次执行结果相同
// 打乱列表顺序
Collections.shuffle(numbers, random);
// 打印打乱后的列表
System.out.println("打乱后的列表: " + numbers);
}
}
php
487 Bytes
© 菜鸟-创作你的创作
输出:

打乱后的列表: [6, 3, 1, 4, 9, 5, 7, 10, 8, 2]
php
39 Bytes
© 菜鸟-创作你的创作
说明:

因为使用了固定的随机种子(new Random(42)),每次运行此代码时,打乱后的顺序都相同。

何时使用 Collections.shuffle()?

抽奖或游戏:当你需要随机化一组数据(如洗牌、抽奖等)时,shuffle() 非常有用。
随机抽样:在从大数据集中随机选择一部分数据时,可以先使用 shuffle() 方法随机打乱列表顺序。
模拟随机事件:例如在模拟实验或测试时,可以使用它来产生不可预测的输出。
总结:

Collections.shuffle() 方法用于随机打乱列表中元素的顺序,通常用于实现随机排序或打乱操作。
它有一个简单的版本和一个允许传入自定义 Random 对象的版本,后者可以确保可重复的随机顺序。
需要注意的是,shuffle() 方法是 原地修改 列表的顺序,而不是返回一个新列表。
如果你有其他问题或者需要进一步的解释,随时告诉我!
https://www.52runoob.com/archives/4503

目录
相关文章
|
2月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
392 5
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
286 18
|
2月前
|
Java 编译器 Go
【Java】(5)方法的概念、方法的调用、方法重载、构造方法的创建
Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用方法的优点使程序变得更简短而清晰。有利于程序维护。可以提高程序开发的效率。提高了代码的重用性。方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson。这种就属于驼峰写法下划线可能出现在 JUnit 测试方法名称中用以分隔名称的逻辑组件。
230 4
|
2月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
326 5
|
3月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
171 11
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
512 3
|
3月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
3月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
430 0
Java API 开发者
138 0