欢迎访问宙启技术站
智能推送

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中生成不重复随机数字的方法,可以根据具体需求选择合适的方法来生成不重复的随机数字。