蒙地卡羅法與隨機化方法

線性同餘產生器(linear-congruential generator)

/ kon-GROO-en-shul /

這是最古老、最簡單的假隨機配方,簡單到可以寫在餐巾紙上:拿上一個數字,乘以某個數,加上某個數,再除以一個大數只留餘數。永遠重複下去。餘數在範圍內彈跳得如此雜亂,乍看之下就像隨機。這條一行的規則就是線性同餘產生器,是早期計算的主力,至今仍是許多基本函式庫函數的預設。

規則是 x_{n+1} = (a * x_n + c) mod m,其中 m 是模數、a 是乘數、c 是增量,都是固定整數;輸出為 u_n = x_n / m,一個落在 [0, 1) 的分數。一切都取決於把 a、c、m 選得好。Hull-Dobell 定理說:週期達到完整的 m(每個 0..m-1 的值在重複前各出現一次)的條件是:c 與 m 互質、a - 1 能被 m 的每個質因數整除、且若 m 是 4 的倍數則 a - 1 也是。即使如此,週期最多也只有 m,所以一個 32 位元的 LCG 大約 40 億個數字後就循環——以現代標準而言太短。

更深層的缺陷既結構性又出名:若你把連續輸出每 d 個分成一組,當成 d 維空間裡的點來畫,LCG 的點並「不」均勻填滿立方體——它們落在少數幾個平行的超平面上(Marsaglia 定理:「隨機數主要落在平面裡」)。這種格點相關會無聲地讓任何觀察連續抽樣組的模擬產生偏差。歷史上的災難 RANDU(a = 65539、m = 2^31)把所有三元組塞進僅僅 15 個平面,汙染了多年的科學成果。LCG 用在隨意、低維的場合沒問題,又快又小,但要做認真的蒙地卡羅工作,它已被梅森旋轉等產生器取代而退役。

一個經典的「最小標準」LCG 用 a = 16807、c = 0、m = 2^31 - 1 = 2147483647(一個質數)。從種子 1 開始它送出 16807、282475249、1622650073、...,在重複前走遍全部 2^31 - 2 個非零餘數——約 20 億個值,然後整條序列原封不動再來一次。

乘、加、取餘數——但要提防隱藏的平面。

切勿把以 2 的冪為模數的 LCG 的低位元當成隨機來用:那些位元的週期極短(最低位可能只是 0,1,0,1 交替)。而且 32 位元 LCG 的週期對大型模擬而言遠遠太短。

又稱
LCG線性同餘法線性同餘亂數產生器