java如何生成随机数不重复
生成不重复随机数的方法
在Java中生成不重复的随机数可以通过多种方式实现,以下是几种常见的方法:
使用HashSet存储随机数
利用HashSet的特性自动去重,确保生成的随机数不重复。当生成的随机数已存在于HashSet中时,重新生成直到获取唯一的数值。
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class UniqueRandom {
public static void main(String[] args) {
Set<Integer> uniqueNumbers = new HashSet<>();
Random random = new Random();
int range = 100; // 随机数范围
int count = 10; // 需要的随机数数量
while (uniqueNumbers.size() < count) {
int num = random.nextInt(range);
uniqueNumbers.add(num);
}
System.out.println(uniqueNumbers);
}
}
使用Fisher-Yates洗牌算法
通过预先生成一个有序的列表,然后使用Fisher-Yates算法进行随机打乱,从而保证随机数的唯一性和随机性。
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class UniqueRandom {
public static void main(String[] args) {
Integer[] array = new Integer[100];
for (int i = 0; i < array.length; i++) {
array[i] = i + 1;
}
List<Integer> list = Arrays.asList(array);
Collections.shuffle(list);
// 获取前10个不重复的随机数
List<Integer> result = list.subList(0, 10);
System.out.println(result);
}
}
使用Stream API
Java 8及以上版本可以使用Stream API结合随机数生成器来生成不重复的随机数。
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class UniqueRandom {
public static void main(String[] args) {
int range = 100;
int count = 10;
Random random = new Random();
IntStream.generate(() -> random.nextInt(range))
.distinct()
.limit(count)
.boxed()
.collect(Collectors.toList())
.forEach(System.out::println);
}
}
使用BitSet记录已生成随机数
通过BitSet记录已生成的随机数,确保每次生成的随机数未被使用过。
import java.util.BitSet;
import java.util.Random;
public class UniqueRandom {
public static void main(String[] args) {
int range = 100;
int count = 10;
BitSet used = new BitSet(range);
Random random = new Random();
int[] result = new int[count];
for (int i = 0; i < count; i++) {
int num;
do {
num = random.nextInt(range);
} while (used.get(num));
used.set(num);
result[i] = num;
}
for (int num : result) {
System.out.println(num);
}
}
}
方法比较
- HashSet:简单易用,适用于小范围随机数生成,但可能因重复生成导致效率问题。
- Fisher-Yates洗牌算法:高效且随机性强,适用于需要生成大量不重复随机数的场景。
- Stream API:代码简洁,适合Java 8及以上版本,但性能可能不如其他方法。
- BitSet:内存占用低,适合大范围随机数生成,但实现稍复杂。
根据具体需求选择合适的方法即可。







