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

方法1:使用HashSet(适用于范围较大的数字)
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();
// 假设我们要生成1-100范围内的不重复随机数
int min = 1;
int max = 100;
while (uniqueNumbers.size() < 10) {
int randomNumber = random.nextInt(max - min + 1) + min;
uniqueNumbers.add(randomNumber);
}
System.out.println("10个不重复的随机数: " + uniqueNumbers);
}
}
方法2:使用数组交换法(适用于范围与数量相近的情况)
import java.util.Arrays;
import java.util.Random;
public class UniqueRandomNumbers {
public static void main(String[] args) {
int count = 10;
int max = 100; // 最大值
int[] numbers = new int[max];
// 初始化数组
for (int i = 0; i < max; i++) {
numbers[i] = i + 1; // 生成1-100的序列
}
Random random = new Random();
// 随机交换位置
for (int i = 0; i < count; i++) {
int randomIndex = random.nextInt(max);
int temp = numbers[i];
numbers[i] = numbers[randomIndex];
numbers[randomIndex] = temp;
}
// 取前count个元素
int[] result = Arrays.copyOf(numbers, count);
System.out.println("10个不重复的随机数: " + Arrays.toString(result));
}
}
方法3:使用Java 8的Stream API(Java 8及以上)
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class UniqueRandomNumbers {
public static void main(String[] args) {
int count = 10;
int max = 100;
int min = 1;
Random random = new Random();
var uniqueNumbers = random.ints(min, max + 1)
.distinct()
.limit(count)
.boxed()
.collect(Collectors.toList());
System.out.println("10个不重复的随机数: " + 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) {
Set<Integer> uniqueNumbers = new HashSet<>();
int min = 1;
int max = 100;
while (uniqueNumbers.size() < 10) {
int randomNumber = ThreadLocalRandom.current().nextInt(min, max + 1);
uniqueNumbers.add(randomNumber);
}
System.out.println("10个不重复的随机数: " + uniqueNumbers);
}
}
注意事项
-
如果要生成的随机数数量接近随机数范围的上限(比如要生成95个不重复的1-100的随机数),方法1和方法3的效率会降低,因为需要多次尝试才能找到不重复的数字,这时方法2更高效。
-
对于非常大的范围(如1到Integer.MAX_VALUE),方法2不适用,因为需要创建一个大数组。
-
所有方法生成的随机数都是伪随机的,如果需要加密安全的随机数,应使用
SecureRandom类替代Random或ThreadLocalRandom。
选择哪种方法取决于你的具体需求和性能考虑。


