- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
随机数生成及其在统计模拟中的应用
随机数生成及其在统计模拟中的应用
黄湘云
关键词: HYPERLINK /tags/%E9%9A%8F%E6%9C%BA%E6%95%B0 随机数; HYPERLINK /tags/%E7%BB%9F%E8%AE%A1%E6%A3%80%E9%AA%8C 统计检验; HYPERLINK /tags/%E6%A8%A1%E6%8B%9F 模拟
审稿:郎大为、边蓓蕾;编辑:吴佳萍
揭秘统计软件如 R,Octave,Matlab 等使用的随机数发生器,然后做一些统计检验,再将其应用到独立随机变量和的模拟中,最后与符号计算得到的精确结果比较。除特别说明外,文中涉及到的随机数都是指伪随机数,发生器都是指随机数发生器。
背景
随机数的产生和检验方法是蒙特卡罗方法的重要部分,另外两个是概率分布抽样方法和降低方差提高效率方法。在 20 世纪 40 年代中期,当时为了原子弹的研制,乌拉姆(S.Ulam)、冯诺依曼(J.von Neumann) 和梅特罗波利斯(N. Metropolis) 在美国核武器研究实验室创立蒙特卡罗方法。当时出于保密的需要,与随机模拟相关的技术就代号 “蒙特卡罗”。早期取得的成果有产生随机数的平方取中方法,取舍算法和逆变换法等。这两个算法的内容 HYPERLINK /2015/06/generating-normal-distr-variates/ 见统计之都王夜笙的文章。
随机数生成
讲随机数发生器,不得不提及一个名为 Mersenne Twister(简称 MT)的发生器,它的周期长达 219937?1,现在是R 、Octave 和 Matlab等软件(较新版本)的默认随机数发生器。
Matlab通过内置的rng函数指定不同的发生器,其中包括1995年Matlab采用 George Marsaglia 在1991年提出的借位减(subtract with borrow,简称SWB)发生器。在Matlab中,设置如下命令可指定发生器及其状态,其中1234是随机数种子,指定发生器的状态,目的是重复实验结果,v5uniform是发生器的名字。
rng(1234, v5uniform) Octave 通过内置的rand函数指定发生器的不同状态,为获取相同的两组随机数,state 参数得设置一样,如1234(你也可以设置为别的值)。Octave已经放弃了老版本内置的发生器,找不到命令去指定早期的发生器,这个和 Matlab 不一样。
rand (state,1234)
rand(1,5)
0.9664535 0.4407326 0.0074915 0.9109760 0.9392690
rand (state,1234)
rand(1,5)
0.9664535 0.4407326 0.0074915 0.9109760 0.9392690
Python的numpy模块也采用MT发生器,类似地,通过如下方式获得相同的两组随机数
import numpy as np
a = np.random.RandomState(1234)
a.rand(5)
array([ 0 0 0 0 0)
a = np.random.RandomState(1234)
a.rand(5)
array([ 0 0 0 0 0)
R的默认发生器也是 MT 发生器,除了设置随机数种子的 seed 参数,还可以通过kind参数指定其他发生器,normal.kind参数指定产生正态分布随机数的发生器,下面也使用类似的方式产生两组完全一样的随机数。
set.seed(seed, kind = NULL, normal.kind = NULL)
set.seed(1234,kind = Mersenne-Twister, normal.kind = Inversion) # 默认参数设置
runif(5)
[1] 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154
set.seed(1234,kind = Mersenne-Twister, normal.kind = Inversion) # 默认参数设置
runif(5)
[1] 0.1137034 0.6222994 0.6092747 0.6233794 0.8609154
SWB发生器中“借位相减”步骤是指序列的第i个随机数zi要依据如下递推关系产生,zi=zi+20
文档评论(0)