Java实现:随机抽取指定范围内N个不重复数的方法
版权申诉
92 浏览量
更新于2024-09-11
收藏 56KB PDF 举报
"Java随机抽取指定范围内不重复的n个数的实现方法"
在Java编程中,生成随机数是一项常见的需求,特别是在模拟、测试或游戏开发等领域。本文将详细介绍如何在指定范围内生成不重复的随机数,并提供两种实现方法。
首先,我们来看一下Java中生成随机数的基本方式:
1. 使用`Math.random()`方法:
这个方法返回一个0.0到(但不包括)1.0之间的double类型随机数。要生成指定范围内的整数,可以通过以下公式进行转换:
```
int randomNumber = (int) Math.round(Math.random() * (max - min)) + min;
```
其中,`min`和`max`分别代表你想要的范围的最小值和最大值。
2. 使用`System.currentTimeMillis()`:
这个方法返回自1970年1月1日以来的毫秒数,可以用来生成一个长整型随机数。通过取模运算可以限制范围,但当在短时间内连续生成多个随机数时,可能会得到相同的值:
```
long randomNum = System.currentTimeMillis();
int randomNumber = (int) (randomNum % (max - min)) + min;
```
3. 使用`java.util.Random`类:
`Random`类提供了更丰富的随机数生成功能,可以通过构造函数`Random()`或`Random(long seed)`创建实例。`Random`类提供了多种生成不同数据类型的随机数的方法,如`nextInt()`、`nextLong()`、`nextFloat()`和`nextDouble()`。如果使用相同的种子创建两个`Random`对象,它们将生成相同的序列。例如:
```
Random random = new Random();
int randomNumber = random.nextInt(max) % (max - min + 1) + min;
```
接下来,我们探讨如何在指定范围内生成不重复的n个随机数:
方法一:两重循环去重
这是一种直观且基础的方法,通过外层循环控制生成n个随机数,内层循环用于检查生成的随机数是否已经存在于结果集合中,如果不存在则添加到结果集合中。这种方法虽然简单,但效率较低,因为随着已生成随机数的增多,内层循环的检查次数会增加。
```java
public List<Integer> getRandomNumbers(int min, int max, int n) {
List<Integer> result = new ArrayList<>();
Random random = new Random();
while (result.size() < n) {
int number = random.nextInt(max - min) + min;
if (!result.contains(number)) {
result.add(number);
}
}
return result;
}
```
方法二:使用集合的removeIf()和shuffle()方法
这种方法利用Java 8的特性,先生成一个包含整个范围的列表,然后通过`removeIf()`移除不符合条件的元素,最后使用`Collections.shuffle()`打乱列表顺序,确保随机性。
```java
public List<Integer> getRandomNumbers(int min, int max, int n) {
List<Integer> numbers = IntStream.rangeClosed(min, max)
.boxed()
.collect(Collectors.toList());
while (numbers.size() > n) {
numbers.removeIf(num -> !new Random().nextInt(numbers.size()) == num);
}
Collections.shuffle(numbers);
return numbers;
}
```
以上两种方法都可以实现从指定范围内随机抽取n个不重复的数,但第二种方法在处理大数据量时效率更高,因为它避免了多次遍历整个列表。在实际开发中,可以根据具体需求选择合适的方法。
点击了解资源详情
2020-09-02 上传
2019-04-19 上传
2018-06-28 上传
2013-04-10 上传
2022-08-27 上传
weixin_38708707
- 粉丝: 5
- 资源: 899
最新资源
- Aspose资源包:转PDF无水印学习工具
- Go语言控制台输入输出操作教程
- 红外遥控报警器原理及应用详解下载
- 控制卷筒纸侧面位置的先进装置技术解析
- 易语言加解密例程源码详解与实践
- SpringMVC客户管理系统:Hibernate与Bootstrap集成实践
- 深入理解JavaScript Set与WeakSet的使用
- 深入解析接收存储及发送装置的广播技术方法
- zyString模块1.0源码公开-易语言编程利器
- Android记分板UI设计:SimpleScoreboard的简洁与高效
- 量子网格列设置存储组件:开源解决方案
- 全面技术源码合集:CcVita Php Check v1.1
- 中军创易语言抢购软件:付款功能解析
- Python手动实现图像滤波教程
- MATLAB源代码实现基于DFT的量子传输分析
- 开源程序Hukoch.exe:简化食谱管理与导入功能