Java函数怎样生成不重复的随机数字?
发布时间:2023-06-29 23:26:33
在Java中,可以使用Random类来生成随机数字。但是,如果要生成不重复的随机数字,可以采取以下几种方式:
1. 使用HashSet来存储已经生成的数字,确保不会重复:
Random random = new Random();
Set<Integer> set = new HashSet<Integer>();
while (set.size() < n) {
int randomNum = random.nextInt(max - min + 1) + min;
set.add(randomNum);
}
List<Integer> uniqueRandomNums = new ArrayList<Integer>(set);
这个方法会一直生成随机数字,直到HashSet的大小达到所需的数量。
2. 使用一个包含所有可能数字的List,然后每次生成一个随机索引来选择一个数字,并将该数字从List中移除:
Random random = new Random();
List<Integer> numList = new ArrayList<Integer>();
for (int i = min; i <= max; i++) {
numList.add(i);
}
List<Integer> uniqueRandomNums = new ArrayList<Integer>();
while (uniqueRandomNums.size() < n && !numList.isEmpty()) {
int randomIndex = random.nextInt(numList.size());
int randomNum = numList.get(randomIndex);
uniqueRandomNums.add(randomNum);
numList.remove(randomIndex);
}
这种方法的前提是范围内的数字可以存入内存中。
3. 使用Fisher-Yates洗牌算法,将所有可能的数字放入一个数组,并随机交换其位置,然后取出前n个数字:
Random random = new Random();
int[] numArr = new int[max - min + 1];
for (int i = min; i <= max; i++) {
numArr[i - min] = i;
}
for (int i = numArr.length - 1; i > 0; i--) {
int j = random.nextInt(i + 1);
int temp = numArr[i];
numArr[i] = numArr[j];
numArr[j] = temp;
}
int[] uniqueRandomNums = Arrays.copyOfRange(numArr, 0, n);
这种方法可以在O(n)的时间复杂度内生成不重复的随机数字。
以上是三种常见的在Java中生成不重复随机数字的方法,可以根据具体需求选择合适的方法来生成不重复的随机数字。
