java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java生成不重复随机数

Java生成N个不重复的随机数的三种方法总结

作者:芒果很忙耶

这篇文章主要为大家详细介绍了三种Java生成N个不重复的随机数的方法,文中的示例代码讲解详细,具有一定的参考价值,有需要的可以了解下

1、Random类和Set集合来完成

Java实现生成n个不重复的随机数可以使用Java中的Random类和Set集合来完成

具体代码如下:

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class RandomNumberGenerator {
    public static Set<Integer> generateRandomNumbers(int n, int max) {
        if (n > max) {
            throw new IllegalArgumentException("n must be less than or equal to max");
        }
        Set<Integer> set = new HashSet<>();
        Random random = new Random();
        while (set.size() < n) {
            int num = random.nextInt(max) + 1;
            set.add(num);
        }
        return set;
    }
    public static void main(String[] args) {
        Set<Integer> set = generateRandomNumbers(5, 100);
        System.out.println(set);
    }
}

上述代码中,使用了一个while循环来生成n个不重复的随机数。在每次循环中,先生成一个范围在1到max之间的随机整数,然后将其加入Set集合中,由于Set集合不允许元素重复,所以会自动去重,直到包含n个元素为止。最后返回生成的随机数集合。

在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用System.out.println打印出来,输出结果类似于[4, 27, 52, 76, 97]

2、使用数组来存储生成的随机数

每次生成随机数之前判断数组中是否已经存在该数,如果存在就继续生成下一个随机数,直到生成了n个不重复的数为止

实现代码如下:

import java.util.Arrays;
import java.util.Random;
public class RandomNumberGenerator {
    public static int[] generateRandomNumbers(int n, int max) {
        if (n > max) {
            throw new IllegalArgumentException("n must be less than or equal to max");
        }
        int[] arr = new int[n];
        Random random = new Random();
        for (int i = 0; i < n; i++) {
            int num;
            do {
                num = random.nextInt(max) + 1;
            } while (contains(arr, num));
            arr[i] = num;
        }
        return arr;
    }
    private static boolean contains(int[] arr, int num) {
        for (int i : arr) {
            if (i == num) {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        int[] arr = generateRandomNumbers(5, 100);
        System.out.println(Arrays.toString(arr));
    }
}

上述代码中,使用了一个for循环来生成n个不重复的随机数。在每次循环中,先生成一个范围在1到max之间的随机整数,然后调用contains方法来判断该数是否已经存在于数组中,如果不存在则加入数组。

在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用Arrays.toString打印出来,输出结果类似于[4, 27, 52, 76, 97]。

3、使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)

除了使用Random类和Set集合或数组来生成n个不重复的随机数,还可以使用Fisher-Yates洗牌算法(也称为Knuth洗牌算法)来实现。该算法的思路是:从原始数组中随机选择一个元素,将其与数组的第一个元素交换位置,然后从剩余的n-1个元素中随机选择一个元素,将其与数组的第二个元素交换位置,以此类推,直到遍历完所有的n个元素为止。

具体实现代码如下:

import java.util.Arrays;
import java.util.Random;
public class RandomNumberGenerator {
    public static int[] generateRandomNumbers(int n, int max) {
        if (n > max) {
            throw new IllegalArgumentException("n must be less than or equal to max");
        }
        int[] arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = i + 1;
        }
        Random random = new Random();
        for (int i = max - 1; i >= max - n; i--) {
            int index = random.nextInt(i + 1);
            int temp = arr[index];
            arr[index] = arr[i];
            arr[i] = temp;
        }
        return Arrays.copyOfRange(arr, max - n, max);
    }
    public static void main(String[] args) {
        int[] arr = generateRandomNumbers(5, 100);
        System.out.println(Arrays.toString(arr));
    }
}

上述代码中,首先创建一个包含1到max的整数数组arr,然后使用Fisher-Yates洗牌算法来随机打乱数组中的元素,最后返回数组中的后n个元素。

在main方法中,我们调用generateRandomNumbers方法来生成5个不重复的1到100之间的随机数,并使用Arrays.toString打印出来,输出结果类似于[4, 27, 52, 76, 97]。

到此这篇关于Java生成N个不重复的随机数的三种方法总结的文章就介绍到这了,更多相关Java生成不重复随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文