一種名為 LoopMix128 的新型偽隨機數生成器引發了演算法專家之間的有趣技術討論,而建立者的旅程始於一個意想不到的源頭:一位使用者關於撲克應用程式隨機化方法的問題。
這種演算法專為非加密應用而設計,在這類應用中速度和統計質量至關重要。它擁有令人印象深刻的特性,包括保證 2^128 的週期、經證實的單射性,以及在 BigCrush 和 PractRand 測試套件中對高達 32TB 資料的乾淨透過。
效能宣告和專家分析
LoopMix128 聲稱具有顯著的效能優勢,據報道其執行速度比 Java 的隨機實現快 8.75 倍,並且效能優於其他現代高速 PRNG,如 xoroshiro128++ 和 PCG64。然而,這些宣告引起了演算法專家(包括 MurmurHash 的建立者)的技術審查。
一位專家表示,考慮到其相對簡單的設計,他對該演算法透過嚴格的統計測試感到驚訝,指出狀態更新函式幾乎是非線性的,而輸出推導是線性的。這引發了關於演算法設計選擇的技術交流,建立者解釋瞭如何透過廣泛測試精心選擇旋轉值以最佳化隨機性質量。
「雖然我不懷疑它通過了 BigCrush 等測試,但我確實對它能透過感到非常驚訝。狀態更新函式實際上是 a = rotate(a, constant) + b; b = rotate(b, constant) + constant; 而輸出推導是 output = (a + b) * constant。」
LoopMix128 主要特點
- 效能:比 Java random 快8.75倍,比 Java xoroshiro128++ 快21%,比 C xoroshiro128++ 和 PCG64 快98%
- 統計質量:通過了 TestU01 的 BigCrush 測試套件和 PractRand(高達32TB)測試,無任何異常
- 週期:保證最小週期長度為 2^128
- 狀態大小:192位狀態,具有經證明的單射性
- PractRand 比較(使用不同種子從256M到8GB的1000次執行):
- LoopMix128:0次失敗,24次可疑
- xoroshiro256++:0次失敗,27次可疑
- xoroshiro128++:0次失敗,28次可疑
- wyrand:0次失敗,32次可疑
- /dev/urandom:0次失敗,37次可疑
狀態大小和統計質量
關於狀態大小容量分析出現了一個有趣的討論,一位評論者建議該演算法的 192 位狀態可能不必要地大。他們指出,即使是已知的差勁演算法(如平方取中法)也可以透過如此大的狀態來透過統計測試,並引用了 PCG 的分析方法,即減少狀態大小直至失敗,以確定演算法具有多少安全餘量。
建立者對這一建議做出了積極回應,後來報告說,僅使用 32 位變數(64 位狀態)的簡化版本仍然通過了高達 256GB 的 PractRand 測試,只有一個不尋常的結果,這表明即使在狀態顯著減少的情況下,該演算法仍具有很強的穩健性。
實際應用
社群討論揭示了高效能 PRNG 的幾個實際應用。圖形和音訊程式設計被強調為 PRNG 效能可能成為總程式效能的可測量部分且沒有安全約束的領域。當為每個音訊樣本或畫素生成噪聲時,極快的演算法提供了切實的好處。蒙特卡洛模擬也被提及為一個明顯的使用場景。
建立者進入 PRNG 開發的旅程始於一個關於撲克應用程式隨機化的簡單問題,這表明好奇心驅動的探索可以導致有意義的技術貢獻。雖然有些人質疑為什麼建立者沒有為撲克應用實現已建立的加密演算法(如 ChaCha),但隨之而來的深入研究產生了一種可能超出其原始背景應用的演算法。
隨著計算在各個領域越來越依賴隨機化技術,從遊戲到科學模擬,像 LoopMix128 這樣的 PRNG 的持續改進代表了演算法開發的一個重要領域,即使是適度的改進也可能產生廣泛的影響。