2013-05-21 39 views
0

我想在Java中生成4位唯一的隨機數。使用預定義的庫在Java中生成4位唯一的隨機數?

假設我運行的應用程序1000次,然後每次我應該得到唯一的隨機數。

我試着用UUID,但它是非常長的隨機碼。我想要4位數的隨機碼。

到目前爲止,我試着用下面的代碼 -

int num = -1; 

ArrayList<Integer> arNumber = new ArrayList<Integer>(); 
for(int x = 0; x < 10; x++) 
{ 
    arNumber.add(x); 
} 
Collections.shuffle(arNumber); 

String strNum = ""; 
for(int i = 0; i < 4; i++) 
    strNum = strNum + arNumber.get(new Random().nextInt(10)); 

num = Integer.parseInt(strNum); 

此代碼工作正常,但我懷疑一些千元后,將重複的數字。

Java中是否有任何內置/預定義的功能/庫/算法?

+4

(I)填充數字的列表,從0到9999(II)洗牌(iii)迭代。 – assylias

+1

@assylias - 上限應該是9999. –

+0

謝謝大家的意見和解答。我會嘗試一些你的方法並回復你。 – Deepu

回答

5

在我understaning如果要生成一個4位數的唯一的隨機數這意味着0和9999之間的數字在這種情況下,該

ArrayList<Integer> arNumber = new ArrayList<Integer>(); 
for (int x = 0; x < 10; x++) { 
    ... 

將在列表中僅產生10個號碼。我會這樣做

class RandomGenerator { 
    List<Integer> ints = new ArrayList<>(); 
    int i = 0; 

    RandomGenerator() { 
     for (int i = 0; i < 10000; i++) { 
      ints.add(i); 
     } 
     Collections.shuffle(ints); 
    } 

    int nextInt() { 
     return ints.get(i++); 
    } 
} 
+1

This。除非你可能想要把一個溢出檢查放到'nextInt()'中,所以當你用完數字時你不會得到索引超出界限的異常。我想,取決於你的用例。 –

+0

我已經嘗試過這種方法,但每次我想要一個數字時,它都會創建一個類的對象,它會創建一個新的列表。那麼重複的可能性 – Deepu

+1

那麼,你應該創建一個RandomGenerator實例一次RandomGenerator rg = new RandomGenerator();然後調用rg.next()<= 1000次;如果這是一個問題,那麼你可以把它變成單例,或者只是把所有內容都變成靜態的。 –

-3

試試這段代碼來實現java中的隨機數。
通numOfCharacters值(假設4)

public static String getRandomalphanumericNumber(int numOfCharacters) { 
     StringBuffer buffer = new StringBuffer(); 
     Random random = new Random(); 
     char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 
       'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 
       'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 
       'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 
       'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', 
       '5', '6', '7', '8', '9', '0' }; 
     for (int i = 0; i < numOfCharacters; i++) { 
      buffer.append(chars[random.nextInt(chars.length)]); 
     } 
     return buffer.toString(); 
    } 
+1

這不會返回字母數字的東西,也不保證是唯一的嗎? –

+0

但我檢查代碼給出了獨特的價值.. – vijayk

+0

這種檢查發生在哪裏?顯然重複不會經常出現,但我不能看到代碼來防止發生這種情況 –

1

我肯定存在着很多關於安全問題的庫,但如果它不是關鍵:

Random r = new Random(); 
List<Integer> codes = new ArrayList<>(); 
for (int i = 0; i < 10; i++) 
{ 
    int x = r.nextInt(9999); 
    while (codes.contains(x)) 
     x = r.nextInt(9999); 
    codes.add(x); 
} 
String str = String.format("%04d", codes.get(0)); 

這應該給你的隨機數,並與String.format你可以將它們填充到4位寬。

+0

這將工作,但會花費更長和更長的時間完成,因爲它更接近完成所有代碼 –

+0

這就對了 - 改進此存儲已生成數字的最小值和最大值,並將其用作隨機生成器的邊界。 (如果原始邊界號碼仍然存在,這仍然不會產生影響!) – Markus

1

嘗試使用安全的隨機。 它會生成一個strong random number,它會給你一個小數< 9999,並且通過使用HashSet的,你保證不會有重複

try 
{ 
    SecureRandom randomGenerator = SecureRandom.getInstance("SHA1PRNG");   
    HashSet<Integer> set = new HashSet<>(); 
    while(set.size()<10) 
     set.add(randomGenerator.nextInt(9999))); 

} catch (NoSuchAlgorithmException nsae) { 
    // Forward to handler 
}