C++帶進位的線性同餘法(subtract_with_carry_engine)生成亂數詳解

2020-07-16 10:04:29
subtract_with_carry_engine 模板定義了實現帶進位減法的亂數引擎,這是對線性同餘演算法的改進。像線性同餘演算法一樣,帶進位減法演算法釆用遞迴關係定義序列中的連續值,但是每個值 xi 都是從序列的前兩個值 xi-r 和 xi-s 計算出的,並不是只由前一個值計算得出。r 和 s 分別被稱作長腳和短腳,並且都必須是正數,r 必須大於 s。生成這個序列的等式如下:△i ={xi-r - xi-s - ci-1) mod m,其中 m 是 2n,n 是一個單詞的位元個數。

c 是一個可能是 0 或 1 的“進位”,這取決於先前的狀態。這個演算法要求種子值 r 和進位 c 的初始值。和線性同餘演算法一樣,帶進位減法演算法也對引數值的選擇非常敏感。

帶進位的線性同餘法的範例

r 為 24、s 是 10 的 ranlux24_base 生成器類會生成 24 位整數的隨機序列。r 是 12、s 是 5 的 ranlux48_base 類產生成 48 位整數的序列。


圖 1(點此檢視高清大圖