簡體   English   中英

唯一或不重復的隨機數生成

[英]Unique or non repeating random number generation

我正在嘗試使用以下函數生成唯一的隨機數。 每當我在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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM