2008-09-25 22 views
4

閱讀這個答案後: best way to pick a random subset from a collection?什麼是在Java中選擇隨機種子的跨平臺方式?

它讓我知道,一個人如何挑選一個隨機數種子?

而不要說使用System.currentTimeMillis()或System.nanoTime()。閱讀文章,看看爲什麼不。

這是一個難題,但讓我更難。假設你需要在不使用用戶輸入的情況下生成一個隨機種子,而不使用用戶輸入(IE,沒有GUI),它必須是跨平臺的(因此不需要JNI來訪問硬件)。

是否有一些我們可以監視的JVM變量作爲我們隨機性的來源?

可以這樣做嗎?或者是不可能的?

回答

6

看看Uncommons Maths(完全披露:我寫了它)。它應該可以解決Java中隨機數字所帶來的大多數問題。如果你不使用它,你應該能夠從它提供的各種SeedGenerator實現中獲得一些想法。基本上,它默認使用/dev/random。如果不存在(例如Windows),它會嘗試從random.org下載數據或使用SecureRandom.generateSeed

我認爲SecureRandom.generateSeed是最好的,你可以做,而不依賴於任何特定平臺或在互聯網上。

+0

哦,哇,你也有組合發生器! 我寫了一個就像幾天前... – Pyrolistical 2008-09-25 23:31:40

+0

我加了Uncommons數學到我的另一個問題: http://stackoverflow.com/questions/130095/most-useful-free-java-libraries#136905 – Pyrolistical 2008-09-25 23:40:05

0

System.currentTimeMillis()與每次生成種子時增加的全局計數器組合在一起。使用AtomicLong作爲計數器,以便您可以提高效率和線程安全性。

「組合」並不意味着「添加」或「異或」,因爲它太容易得到重複。相反,散列。你可能會變得複雜,把長長的櫃檯塞進16字節和MD5它,但我可能會使用64位版本的Adler CRC或其他64-bit CRC

0

恩,那篇文章說32位種子不好,但是64位種子很好。 System.currentTimeMillis()是一個64位的種子。