java如何生成随机数不重复的
生成不重复随机数的方法
在Java中生成不重复的随机数有多种方法,以下是几种常见的实现方式:
使用Collections.shuffle方法
将数字放入列表中,打乱顺序后取出前N个元素:
List<Integer> numbers = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
for (int i = 0; i < 10; i++) {
System.out.println(numbers.get(i));
}
使用Set集合特性
利用Set不允许重复元素的特性:
Random random = new Random();
Set<Integer> set = new HashSet<>();
while (set.size() < 10) {
set.add(random.nextInt(100) + 1);
}
for (Integer num : set) {
System.out.println(num);
}
使用Fisher-Yates洗牌算法
直接实现洗牌算法:
int[] arr = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = i + 1;
}
Random random = new Random();
for (int i = arr.length - 1; i > 0; i--) {
int index = random.nextInt(i + 1);
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
使用Stream API(Java 8+)
利用Stream的distinct和limit方法:
Random random = new Random();
random.ints(1, 101)
.distinct()
.limit(10)
.forEach(System.out::println);
注意事项
- 当需要生成的随机数范围较大而数量较少时,Set方法效率较高
- 当需要生成接近范围上限数量的随机数时,洗牌算法更合适
- 对于大量数据,应考虑使用更高效的数据结构如BitSet
- 在多线程环境下应使用ThreadLocalRandom替代Random







