Java 随机生成不重复的数字
在Java中,有几种方法可以生成不重复的随机数字,以下是几种常用的实现方式:

方法1:使用Set集合(适用于小范围数字)
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class UniqueRandomNumbers {
public static void main(String[] args) {
int count = 10; // 需要生成的随机数数量
int max = 100; // 随机数最大值
Set<Integer> uniqueNumbers = new HashSet<>();
Random random = new Random();
while (uniqueNumbers.size() < count) {
int num = random.nextInt(max) + 1; // 生成1到max之间的随机数
uniqueNumbers.add(num);
}
System.out.println("生成的随机数: " + uniqueNumbers);
}
}
方法2:使用Fisher-Yates洗牌算法(适用于大范围数字)
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class UniqueRandomNumbers {
public static void main(String[] args) {
int count = 10; // 需要生成的随机数数量
int max = 100; // 随机数最大值
// 创建1到max的列表
List<Integer> numbers = new ArrayList<>();
for (int i = 1; i <= max; i++) {
numbers.add(i);
}
// 打乱列表顺序
Collections.shuffle(numbers, new Random());
// 取前count个元素
List<Integer> result = numbers.subList(0, count);
System.out.println("生成的随机数: " + result);
}
}
方法3:使用Java 8 Stream API
import java.util.Random;
import java.util.stream.Collectors;
public class UniqueRandomNumbers {
public static void main(String[] args) {
int count = 10; // 需要生成的随机数数量
int max = 100; // 随机数最大值
List<Integer> uniqueNumbers = new Random()
.ints(1, max + 1) // 生成1到max之间的随机数
.distinct() // 确保不重复
.limit(count) // 限制数量
.boxed() // 转为Integer
.collect(Collectors.toList());
System.out.println("生成的随机数: " + uniqueNumbers);
}
}
方法4:使用ThreadLocalRandom(Java 7+)
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
public class UniqueRandomNumbers {
public static void main(String[] args) {
int count = 10; // 需要生成的随机数数量
int max = 100; // 随机数最大值
Set<Integer> uniqueNumbers = new HashSet<>();
while (uniqueNumbers.size() < count) {
int num = ThreadLocalRandom.current().nextInt(1, max + 1);
uniqueNumbers.add(num);
}
System.out.println("生成的随机数: " + uniqueNumbers);
}
}
注意事项
- 当需要的随机数数量接近随机数范围大小时(如需要95个1-100的随机数),前几种方法效率会降低
- 对于大范围数字生成,方法2(Fisher-Yates)更高效
- 如果需要加密安全的随机数,应使用
SecureRandom而不是Random
选择哪种方法取决于你的具体需求,特别是需要生成的随机数数量和范围。

