java - 唯一或不重复的随机数生成

标签 java random

我正在尝试使用以下函数生成唯一的随机数。每当我以 1000 次循环运行代码时,它也会生成重复的数字。

代码

private static String randomize() {
        int count = 10;
        List<Integer> digits = createList(count);
        Collections.shuffle(digits); // this re-arranges the elements in the list
        return listToString(digits);
    }

    private static <T> String listToString(List<T> list) {
        StringBuilder result = new StringBuilder();
        for (T object : list) {
            result.append(object);
        }
        return result.toString();
    }

    private static List<Integer> createList(int size) {
        List<Integer> result = new ArrayList<Integer>(size);
        for (int i = 0; i < size; i++) {
            result.add(i);
        }
        return result;
    }

public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            String strName = randomize();
            System.out.println(strName);
        }

我在google上搜索了很多,也尝试了ThreadLocal,但它对我没有帮助。任何有关这方面的帮助或指导都会非常有帮助。我的想法是在循环内生成 10 位不重复的随机数。

最佳答案

你并没有真正生成随机数,是吗?您正在生成 10 个唯一数字 [0..9] 的随机排列。 (例如“0123456789”、“9834105672”等)由于只有 3268800(10!)个独特的排列,因此您有很大的机会在 1000 次尝试中找到重复的排列。

(我还没有算出数学公式,但由于 1000^2 在 10 的数量级内!我的直觉告诉我,在任何给定的集合中至少有 10% 的机会出现重复。Google“生日”悖论”了解详情。)

您想要做的,以及 @Andrei 试图解释的,是每次调用 randomize() 时检查/存储结果,以确保没有重复项。大致:

public static void main(String[] args) {
    Set<String> results = new HashSet<>(1000);
    while (results.size() < 1000) {
        String strName = randomize();
        if (!results.contains(strName)) {
            System.out.println(strName);
            results.add(strName);
        }
    }
}

当然,除非您确实想要一组随机数:

public static void main(String[] args) {
    Set<Long> results = new HashSet<>(1000);
    while (results.size() < 1000) {
        // Random number on [1E9..1E10]
        long random = (long) (Random.nextDouble() * 900000000L) + 100000000L;
        if (!results.contains(random)) {
            System.out.println(random);
            results.add(random);
        }
    }
}

关于java - 唯一或不重复的随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50707798/

相关文章:

java - 如何为独立的java应用程序存储简单数据

C11 替代兰特?

java - 如何计算 5 点多边形中的点

php - 使用 Doctrine 获取随机记录

c++ - 使用 openMP 的线程安全随机数生成器

algorithm - 从集合中以相等概率选择数字

javascript - 如何生成随机分布以使字符(在单词/短语中)更自然地出现

java - 在 Java 中递归创建 Hashmap

java - 使用用户名和密码登录 LinkedIn 失败

java - 正确的模型- View - Controller 设计