2010-02-06 59 views
9

爲什麼這個類在其線性同餘公式中使用了48位的種子? 我會期待32或64 ...爲什麼48位種子在util隨機類?

我知道它需要更高的位數時詢問32位值。但爲什麼只有16個額外的位?這是一個「隨機」選擇嗎?

+1

此鏈接http://www.javamex.com/tutorials/random_numbers/java_util_random_algorithm.shtml表示使用的參數取自也使用48位的UNIX rand48生成器。知道爲什麼48會很有趣? – sateesh 2010-02-06 17:42:29

回答

4

因爲LCG的性質使得狀態的低階位根本不是非常隨機的,所以需要比輸出位更多的狀態位。所以如果你想要32位輸出,你需要32位以上的狀態。

爲什麼用48而不是64?因爲48就足夠了,你在設計這個幾十年前,所以有很好的理由要避免使用比絕對必要的更多的資源。

1

它背後的數學來自數論和僞隨機數發生器的數學定義。這當然不是一個「隨機」(解釋爲任意)選擇。

計算機上的隨機數發生器實際上是試圖成爲一個真正的僞隨機數發生器。

您可以將一個僞隨機數發生器看作一個擴展函數,它接受輸入seed,然後輸出一個數字流G(seed)。理想情況下,您希望您的僞隨機數生成器與真隨機數生成器無法區分,但您還必須認識到,您的僞隨機數生成器必須被有效採樣(多項式時間)和確定性(意味着它放置完全相同流給予相同的輸入種子)。

所以只有32位的種子空間意味着希望確定你的流是真正隨機的攻擊者(或根據隨機數生成器破壞你的加密算法)只需要經過32位密鑰空間(種子空間)並對發生器的輸出進行採樣,以與您提供的「隨機」流進行比較,看看它是否匹配。再添加16個位會在密鑰(種子)空間中增加更多的範圍,使枚舉所有可能的密鑰(種子)變得更加困難。

至於爲什麼不去完整的64位......可能當算法被實現時,硬件處理能力不像現在在基於x64的現代處理器上那樣有效地支持64位操作,因此它們停止在48處