java如何生成随机数不重复
生成不重复随机数的方法
在Java中生成不重复的随机数可以通过多种方式实现,以下是几种常见的方法:
使用Collections.shuffle
通过将数字放入列表并打乱顺序来确保不重复:
List<Integer> numbers = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
numbers.add(i);
}
Collections.shuffle(numbers);
// 取前N个不重复随机数
for (int i = 0; i < 10; i++) {
System.out.println(numbers.get(i));
}
使用Set存储已生成的随机数
利用Set自动去重的特性:
Random random = new Random();
Set<Integer> uniqueNumbers = new HashSet<>();
while (uniqueNumbers.size() < 10) {
int num = random.nextInt(100) + 1;
uniqueNumbers.add(num);
}
// 输出结果
for (Integer num : uniqueNumbers) {
System.out.println(num);
}
使用Java 8的Stream API
利用Java 8的流式操作生成不重复随机数:
Random random = new Random();
List<Integer> uniqueRandoms = random.ints(1, 101)
.distinct()
.limit(10)
.boxed()
.collect(Collectors.toList());
// 输出结果
uniqueRandoms.forEach(System.out::println);
使用Fisher-Yates洗牌算法
实现自定义的洗牌算法:
int[] array = new int[100];
for (int i = 0; i < array.length; i++) {
array[i] = i + 1;
}
Random random = new Random();
for (int i = array.length - 1; i > 0; i--) {
int index = random.nextInt(i + 1);
int temp = array[index];
array[index] = array[i];
array[i] = temp;
}
// 取前10个元素
for (int i = 0; i < 10; i++) {
System.out.println(array[i]);
}
使用BitSet跟踪已生成的数字
对于大范围随机数生成,可以使用BitSet提高效率:
Random random = new Random();
BitSet used = new BitSet(101);
int count = 0;
while (count < 10) {
int num = random.nextInt(100) + 1;
if (!used.get(num)) {
used.set(num);
count++;
System.out.println(num);
}
}
每种方法适用于不同的场景,选择时应考虑性能需求和随机数范围大小。对于小范围随机数,Collections.shuffle或Set方法简单高效;对于大范围随机数,Fisher-Yates或BitSet方法更节省内存。







