2012-10-15 158 views
0

我用下面的代碼來生成隨機數:隨機數生成查詢

long randNo = Math.round(Math.random() * 10000); 

我有,我發現重複的一些情況。它可能會生成相同的數字嗎?

+0

ref http://stackoverflow.com/questions/4655931/12-digit-unique-random-number-generation-in-java – Salil

+5

你似乎不明白「隨機」的含義。 –

+3

當然,它可能會產生相同的數字。隨機性和唯一性是兩個完全不同的東西。 – Jesper

回答

2

是的,這是可能的。如果你需要生成從0 10000件不同的隨機數到9999,您可以生成連續的10000號列表,然後調用Collections.shuffle就可以了。

1

如果您需要高質量的隨機數「開箱即用」,例如用於產生隨機加密密鑰或情況下,要克服一些java.util.Random中的弱點,那麼你就可以大致使用java.security.SecureRandom作爲一個下拉更換爲java.util.Random

Random diceRoller = new SecureRandom(); 
// proceed as before... 

SecureRandom實現提供隨機性更高的質量,並與幫助,從操作系統,採用熵的來源種子本身(或「真正的不可預測性」)在本地機器上可用。但是,它比其他典型發電機慢大約20-30倍。 (請注意,「慢」仍然意味着你可以產生大約在第二個一百萬隨機多頭在2GHz的處理器!)

參考:http://www.javamex.com/tutorials/random_numbers/generators_overview.shtml

+0

感謝。有沒有什麼辦法可以在上面的代碼中生成唯一的數字?在此先感謝 –

+0

隨機性從不保證唯一性。如果你想生成唯一的號碼試圖保持獨特的號碼池,並從池中挑選號碼 – Anshu

1

利用隨機數,在範圍內的所有數字都同樣可能。這意味着如果你得到一個數字,下一個值就像它第一次出現一樣。

順便說一句:在你的例子中使用round不是一個好主意,因爲數字1到9999的可能性是相同的,但數字0和10000的可能性只有一半,只有半數舍入或半數舍入。

一種更有效的方式是使用

Random rand = new Random(); 

// as needed 
int num = rand.nextInt(10000); // will be [0, 10000) 

如果你需要生成唯一的號碼,你可以使用Collections.shuffle

List<Integer> nums = new ArrayList<Integer>(); 
for(int i = 0; i < 10000; i++) nums.add(i); 
Collections.shuffle(nums); 

這會給你最多10000識別號隨機訂購。

+0

感謝。有沒有什麼辦法可以在上面的代碼中生成唯一的數字?在此先感謝 –

+0

我加入了一個例子唯一的編號。 –

+1

謝謝Peter ... –