蒙地卡羅法與隨機化方法

梅森旋轉演算法(Mersenne Twister)

/ mer-SEN TWIST-er /

如果說線性同餘產生器是假隨機界那台靠不住的老爺車,梅森旋轉演算法就是取而代之、成為 Python、R、MATLAB 及無數工具預設的那台可靠家庭房車。它由松本與西村於 1997 年發明,產生的偽隨機數序列週期極長、統計品質優異,同時又快——這正是它二十年來一直是日常蒙地卡羅模擬主力的原因。

它的全名 MT19937 點出招牌特性:週期為 2^19937 - 1,一個梅森「質數」(形如 2^p - 1 的質數),大到沒有任何模擬會把它用盡。內部它保有一個由 624 個字(約 19937 位元)組成的大狀態,而且不是單純乘法,而是「旋轉」:它用位移、XOR,以及一個把輸出位元打散以平整其統計的回火步驟,去組合狀態中相隔甚遠的字。結果是高維均勻分布——它的連續輸出在高達 623 維的空間裡都均勻散開,治好了困擾 LCG 的格點平面病,並順利通過標準的隨機性檢驗套組(Diehard、TestU01 的 Crush)。

它優異卻不完美,誠實很重要。梅森旋轉「不」具密碼學安全性:觀察 624 個輸出就能讓攻擊者重建整個內部狀態並預測之後每一個數字,所以切勿用於金鑰、密碼或資安。它龐大的狀態使播種變得棘手——一顆大半為零的種子會讓產生器在很長的暖機期內輸出接近零的低品質數字,而且它可能無法通過更嚴格的 BigCrush 檢驗。較新的設計(PCG、xoshiro、以計數器為基礎的 Philox)狀態更小、播種更快、更易平行化,連更難的檢驗都能通過,因此整個領域正逐漸轉向——但就可重現的科學模擬而言,旋轉演算法仍是一個穩健、廣受信賴的預設。

在 Python 中,random.seed(42) 後再呼叫 random.random(),永遠得到同一個第一個值 0.6394267984578837,因為梅森旋轉一旦播種就完全確定。NumPy 較舊的預設 RandomState 用的就是這個產生器;其較新的 default_rng 改用 PCG64,正說明了領域逐漸超越 MT 的走向。

一個 19937 位元的狀態加上旋轉遞迴:週期巨大、統計優良,但可預測。

梅森旋轉的長週期並「不」代表它能安全地在平行執行間共用:天真的播種(例如連號種子)可能產生重疊或相關的子序列。請改用專門的序列切分(跳躍前進),或用對平行友善的產生器。

又称
MT19937梅森旋轉法馬特賽特旋轉演算法