唯一或非重复随机数生成

时间:2018-06-05 19:42:22

标签: 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);
        }

我在谷歌搜索了很多,并尝试了ThreadLocal,它没有帮助我。任何有关此的帮助或指南都会非常有用。我的想法是在循环中生成10位非重复随机数。

1 个答案:

答案 0 :(得分:1)

你真的没有生成随机数,是吗?您正在生成10个唯一数字[0..9]的随机排列。 (例如&#34; 0123456789&#34;,&#34; 9834105672&#34;等)由于只有3268800(10!)个唯一的排列,你有很大的机会在1000次尝试中击中重复。

(我还没有计算出数学,但是因为1000 ^ 2在10的数量级内!我的直觉告诉我,任何重复的机会至少有10%。给定集.Google&#34;生日悖论&#34;详情。)

你想做什么,以及@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);
        }
    }
}