蒙特卡罗方法
目录
1 随机数生成器 2
1.1 随机数生成器的要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Lehmer 线性同余法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1 16807 产生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Tausworthe 位移计数器法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.1 R250 产生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Fibonacci 延迟产生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4.1 带载减法产生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4.2 带载减法 Weyl 产生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Marsaglia 产生器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.6 伪随机数的统计检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.6.1 独立性与相关系数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.6.2 均匀性检验-频率检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.6.3 多维频率检验 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1
1 随机数生成器
1.1 随机数生成器的要求
1. 周期长: 伪随机数一定具有周期, 希望周期尽可能长, 如大于 int 的最大值 2147483647
2. 随机性好: 生成的随机数列之间没有明显的相关性
3. 生成速度快: 生成随机数的速度要快
1.2 Lehmer 线性同余法
线性同余法的迭代公式为
𝐼
𝑛+1
= (𝑎𝐼
𝑛
+ 𝑏) mod 𝑚
为了得到 [0, 1] 之间的随机数, 可以将 𝐼
𝑛
除以 𝑚,
𝑥
𝑛
=
𝐼
𝑛
𝑚
其中 𝑚 的取值通常为 𝑖𝑛𝑡32 的最大值 2147483647
1.2.1 16807 产生器
16807 生器是线性同余法的一种特例, 已经通过了许多理论测试和大量实用的考验, 认为是 32
机上最有效的产生器. 其参数为
𝑎 = 16807, 𝑏 = 0, 𝑚 = 2147483647
可惜当 𝐼
𝑛
很大时, 计算 𝑎𝐼
𝑛
会溢出. 因而需要 Schrage 方法进行取模. 考虑将 𝑚 分解
𝑚 = 𝑎 · 𝑞 + 𝑟, 0 𝑟 < 𝑎
它们都是整数, 那么
𝑞 =
𝑚
𝑎
, 𝑟 = 𝑚 mo d 𝑎
考虑上一个迭代的结果为 𝑧, 它的上界为 𝑚, 那么考虑将下一次迭代变形
𝑎𝑧 =
𝑧
𝑞
(𝑎𝑞 + 𝑟) +
𝑟𝑧
𝑞
=
𝑧
𝑞
(𝑎𝑞 + 𝑟) + 𝑎(𝑧 mod 𝑞)𝑞
𝑧
𝑞
𝑟
由于 𝑎𝑞 + 𝑟 = 𝑚, 所以取模可以将其舍去, 那么
𝑎𝑧 𝑎(𝑧 mod 𝑞)
𝑧
𝑞
𝑟 mod 𝑚
最后根据符号判断是否应该加上 𝑚
𝐼
𝑛+1
=
𝑎(𝑧 mod 𝑞)
𝑧
𝑞
𝑟, if 𝑎(𝑧 mod 𝑞)
𝑧
𝑞
𝑟 0
𝑎(𝑧 mod 𝑞)
𝑧
𝑞
𝑟 + 𝑚, otherwise
1.3 Tausworthe 位移计数器法
Tausworthe 法又称一般反馈位计数器法, 它用于消线性同余法中的关. 定已有了一个随机
数列 {𝐼
1
, 𝐼
2
, · · · , 𝐼
𝑛
}, 那么就可以
𝐼
𝑛
= 𝐼
𝑛 𝑝
𝐼
𝑛𝑞
其中 表示异或运算, 𝑝, 𝑞 是两个整数, 它们的选择是关键的. 一般来说, 它们的选择应该使得
𝑝
2
+ 𝑞
2
+ 1 𝑖𝑠 𝑝𝑟𝑖𝑚𝑒
这被称为梅森素数, 常见的可以列举如下
[31, 3], [98, 27], [250, 103], [1279, 216418], [9689, 84471183624444187]
一般来,𝑝, 𝑞 越大产生的随机数质量越好. 常使用线性同余法产生具 𝑝 个数的初始序列, 然后再使
Tausworthe 方法产生随机数列
1.3.1 R250 产生器
R250 产生器是一种 Tausworthe 方法的特例, 它的参数为
𝑝 = 103, 𝑞 = 250
1.4 Fibonacci 延迟产生器
位移计数器是一种特殊的 Fibonacci 延迟产生器. 一般的 Fibonacci 延迟产生器的迭代公式为
𝐼
𝑛
= 𝐼
𝑛 𝑝
𝐼
𝑛𝑞
mod 𝑚
其中 可以表示加减乘除异或等运, 数对 [𝑝, 𝑞] 表示延迟.Fibonacci 延迟产生器的周期非常长,
32
位机上可以达到
(
2
𝑝
1
)
2
31
1.4.1 带载减法产生器
带载减法产生器是一种复杂的类 Fibonacci 延迟产生器, 它的迭代公式为
𝐼
𝑛
= 𝐼
𝑛
22
𝐼
𝑛
43
𝐶
其中 𝐶 由以下公式确定
𝐶 =
0, if 𝐼
𝑛
0
1, 𝐼
𝑛
= 𝐼
𝑛
+
2
32
5
otherwise
1.4.2 带载减法 Weyl 产生器
带载减法 Weyl 产生器是一种复杂的类 Fibonacci 延迟产生器. 它先通过带载减法产生器产生一个序列 𝐽
𝑛
𝐽
𝑛
= 𝐽
𝑛22
𝐽
𝑛43
𝐶, 𝐶 =
0, if 𝐽
𝑛
0
1, 𝐽
𝑛
= 𝐽
𝑛
+
2
32
5
otherwise
然后再由 𝐽
𝑛
产生 𝐼
𝑛
𝐾
𝑛
=
(
𝐾
𝑛1
362436069
)
mod 2
32
, 𝐼
𝑛
= (𝐽
𝑛
𝐾
𝑛
) mod 2
32
1.5 Marsaglia 产生器
Marsaglia 产生器使用两种随机数生成器生成随机数列. 首先使用减法操作的 Fibonacci 延迟产生器
𝑥
𝑛
=
𝑥
𝑛97
𝑥
𝑛33
, if 𝑥
𝑛97
𝑥
𝑛33
0
𝑥
𝑛97
𝑥
𝑛33
+ 1, otherwise
第二个随机数生成器是
𝑎 𝑏 =
𝑎 𝑏, if 0
𝑎 𝑏 + 16777213/16777216, otherwise
迭代公式为
𝑦
𝑛
= 𝑦
𝑛1
(16777213/16777216)
最后组合两个随机数列
𝑧
𝑛
= 𝑥
𝑛
𝑦
𝑛
1.6 伪随机数的统计检验
1.6.1 独立性与相关系数
为了验证随机数序列中 𝑥
𝑛
𝑥
𝑛+𝑙
之间是否具有线性关系, 定义相关系数
𝐶
𝑙
=
𝑥
𝑛
𝑥
𝑛+𝑙
𝑥
𝑛
𝑥
2
𝑛
𝑥
𝑛
2
其中
𝑥
意为 𝑥 的平均值. 𝑥
𝑛
𝑥
𝑛+𝑙
毫不相关, 那么期望就应当有
𝑥
𝑛
𝑥
𝑛+𝑙
=
𝑥
𝑛
𝑥
𝑛+𝑙
由于它们只是同一个序列中的不同位置, 显然都应等于
𝑥
𝑛
, 进而
𝐶
𝑙
= 0
因而期望中 𝐶
𝑙
应当越小越好
1.6.2 均匀性检验-频率检验
期望理想机数成器序列是均, 们都服从匀分. 随机的区划分 𝐾
个小区间, 每个小区间的频数 𝑛
𝑘
应当都区域理论值 𝑚
𝑘
𝑚
𝑘
=
𝑁
𝐾
采用
拟合优度检验
确定随机数序列是否服从均匀分布. 取原假设
𝐻
0
: 随机数序列服从均匀分布
那么取统计量
𝑇 =
𝐾
𝑘=1
(𝑛
𝑘
𝑚
𝑘
)
2
𝑚
𝑘
𝜒
2
𝑘1
它就应该服从卡方分布.𝑇 = 0 时显然支持原假设, 因而取 𝛼 上分位数, 拒绝域为
𝑇 > 𝜒
2
𝑘1
(1 𝛼)
1.6.3 多维频率检验
对于多维的情形, 不妨以二维为例. 将二维平面划分 𝐾 × 𝐾 个小区间, 那么每个小区间的频数 𝑛
𝑖 𝑗
应当
都接近于理论值 𝑚
𝑖 𝑗
𝑚
𝑖 𝑗
=
𝑁
𝐾
2
取统计量
𝑇 =
𝐾
𝑖=1
𝐾
𝑗=1
(𝑛
𝑖 𝑗
𝑚
𝑖 𝑗
)
2
𝑚
𝑖 𝑗
𝜒
2
(𝐾 1)
2
同样可以构造卡方变量进行检验