Java生成N个不重复的随机数的三种方法总结
1、Random类和Set集合来完成
Java实现生成n个不重复的随机数可以使用Java中的Random类和Set集合来完成
具体代码如下:
import java.util.HashSet; import java.util.Random; import java.util.Set; public class RandomNumberGenerator { public static Set<Integer> generateRandomNumbers(int n, int max) { if (n > max) { throw new IllegalArgumentException("n must be less than or equal to max"); } Set<Integer> set = new HashSet<>(); Random random = new Random(); while (set.size() < n) { int num = random.nextInt(max) + 1; set.add(num); } return set; } public static void main(String[] args) { Set<Integer> set = generateRandomNumbers(5, 100); System.out.println(set); } }
上述代码中,使用了一个while循环来生成n个不重复的随机数。在每次循环中,先生成一个范围在1到max之间的随机整数,然后将其加入Set集合中,由于Set集合不允许元素重复,所以会自动去重,直到包含n个元素为止。最后返回生成的随机数集合。
在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用System.out.println打印出来,输出结果类似于[4, 27, 52, 76, 97]
2、使用数组来存储生成的随机数
每次生成随机数之前判断数组中是否已经存在该数,如果存在就继续生成下一个随机数,直到生成了n个不重复的数为止
实现代码如下:
import java.util.Arrays; import java.util.Random; public class RandomNumberGenerator { public static int[] generateRandomNumbers(int n, int max) { if (n > max) { throw new IllegalArgumentException("n must be less than or equal to max"); } int[] arr = new int[n]; Random random = new Random(); for (int i = 0; i < n; i++) { int num; do { num = random.nextInt(max) + 1; } while (contains(arr, num)); arr[i] = num; } return arr; } private static boolean contains(int[] arr, int num) { for (int i : arr) { if (i == num) { return true; } } return false; } public static void main(String[] args) { int[] arr = generateRandomNumbers(5, 100); System.out.println(Arrays.toString(arr)); } }
上述代码中,使用了一个for循环来生成n个不重复的随机数。在每次循环中,先生成一个范围在1到max之间的随机整数,然后调用contains方法来判断该数是否已经存在于数组中,如果不存在则加入数组。
在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用Arrays.toString打印出来,输出结果类似于[4, 27, 52, 76, 97]。
3、使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)
除了使用Random类和Set集合或数组来生成n个不重复的随机数,还可以使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)来实现。该算法的思路是:从原始数组中随机选择一个元素,将其与数组的第一个元素交换位置,然后从剩余的n-1个元素中随机选择一个元素,将其与数组的第二个元素交换位置,以此类推,直到遍历完所有的n个元素为止。
具体实现代码如下:
import java.util.Arrays; import java.util.Random; public class RandomNumberGenerator { public static int[] generateRandomNumbers(int n, int max) { if (n > max) { throw new IllegalArgumentException("n must be less than or equal to max"); } int[] arr = new int[max]; for (int i = 0; i < max; i++) { arr[i] = i + 1; } Random random = new Random(); for (int i = max - 1; i >= max - n; i--) { int index = random.nextInt(i + 1); int temp = arr[index]; arr[index] = arr[i]; arr[i] = temp; } return Arrays.copyOfRange(arr, max - n, max); } public static void main(String[] args) { int[] arr = generateRandomNumbers(5, 100); System.out.println(Arrays.toString(arr)); } }
上述代码中,首先创建一个包含1到max的整数数组arr,然后使用Fisher-Yates洗牌算法来随机打乱数组中的元素,最后返回数组中的后n个元素。
在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用Arrays.toString打印出来,输出结果类似于[4, 27, 52, 76, 97]。
到此这篇关于Java生成N个不重复的随机数的三种方法总结的文章就介绍到这了,更多相关Java生成不重复随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Elasticsearch中store field与non-store field的区别说明
这篇文章主要介绍了Elasticsearch中store field与non-store field的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07SpringBoot3整合SpringDoc OpenAPI生成接口文档的详细过程
SpringDoc OpenAPI 是一个强大的工具,能够帮助我们轻松生成 OpenAPI 3.0 规范的文档,并提供交互式的 Swagger UI 界面,所以本文给大家介绍了SpringBoot3整合SpringDoc OpenAPI生成接口文档的详细过程,需要的朋友可以参考下2024-07-07SpringBoot返回对象时,如何将Long类型转换为String
这篇文章主要介绍了SpringBoot返回对象时,实现将Long类型转换为String,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-06-06springboot post接口接受json时,转换为对象时,属性都为null的解决
这篇文章主要介绍了springboot post接口接受json时,转换为对象时,属性都为null的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10Spring与MyBatis集成 AOP整合PageHelper插件的操作过程
Spring与MyBatis集成的主要目的是为了提供更强大的数据访问和事务管理能力,以及简化配置和提高开发效率,这篇文章主要介绍了Spring与MyBatis集成AOP整合PageHelper插件,需要的朋友可以参考下2023-08-08
最新评论