在Java中生成随机无重复数字的方法有多种,下面详细介绍几种常见的方法:

1、使用Set集合类:
Set集合不允许有重复的元素,因此可以很好地用于存储和检查不重复的随机数,HashSet是Java中的一种集合类,使用哈希表实现,提供了O(1)的时间复杂度来添加和检查元素是否存在。
示例代码:
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class UniqueRandomNumbers {
public static void main(String[] args) {
Set<Integer> uniqueNumbers = new HashSet<>();
Random random = new Random();
int n = 10; // 需要生成的随机数数量
while (uniqueNumbers.size() < n) {
int num = random.nextInt(100); // 生成一个0到99之间的随机数
uniqueNumbers.add(num);
}
System.out.println("Unique Random Numbers: " + uniqueNumbers);
}
}
2、使用数组并手动移除已生成的随机数:
每次生成一个随机数后,从候选列表中移除该数字,这种方法适用于随机数范围较小的情况。
示例代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RemoveGeneratedNumbers {
public static void main(String[] args) {
int n = 10; // 需要生成的随机数数量
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 100; i++) { // 预定义范围099
numbers.add(i);
}
Random random = new Random();
for (int i = 0; i < n; i++) {
int index = random.nextInt(numbers.size());
int num = numbers.get(index);
numbers.remove(index);
System.out.println(num);
}
}
}
3、使用FisherYates洗牌算法:
FisherYates洗牌算法是一种生成随机排列的算法,常用于打乱一个数组或列表,通过打乱一个范围内的所有数字,然后选择前n个作为不重复的随机数。
示例代码:
import java.util.Random;
public class FisherYatesShuffle {
public static void main(String[] args) {
int range = 100;
int count = 10;
int[] array = new int[range];
for (int i = 0; i < range; i++) {
array[i] = i;
}
Random random = new Random();
for (int i = range 1; i > 0; i) {
int j = random.nextInt(i + 1);
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
int[] result = new int[count];
System.arraycopy(array, 0, result, 0, count);
System.out.print("Unique Random Numbers: ");
for (int num : result) {
System.out.print(num + " ");
}
}
}
4、利用流操作:
Java 8引入了流操作,使得生成不重复随机数的代码更加简洁,IntStream.generate生成随机数流,distinct确保每个数字唯一,limit限制生成的数量,boxed将基本类型转换为包装类型,最后collect收集结果。
示例代码:

import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class UniqueRandomNumbersStream {
public static void main(String[] args) {
int n = 10; // 需要生成的随机数数量
Random random = new Random();
var uniqueNumbers = IntStream.generate(() > random.nextInt(100))
.distinct()
.limit(n)
.boxed()
.collect(Collectors.toList());
System.out.println("Unique Random Numbers: " + uniqueNumbers);
}
}
相关问题与解答
问题一:如何在Java中生成指定范围内的不重复随机数?
答:可以使用Set集合类、数组并手动移除已生成的随机数、FisherYates洗牌算法以及利用流操作等方式来生成指定范围内的不重复随机数,具体实现方法可以参考上述介绍的代码示例。
问题二:如何优化生成大量不重复随机数的性能?
答:当需要生成大量不重复随机数时,性能可能会下降,可以通过预先定义可能的范围并随机打乱顺序来优化性能,可以先创建一个包含所有可能值的列表,然后使用Collections.shuffle方法将其随机打乱,最后取前n个元素作为结果,这种方法可以在需要生成大量不重复随机数时有效提升性能。
各位小伙伴们,我刚刚为大家分享了有关“Java 中实现随机无重复数字的方法”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!














