[MCSM]伪随机数和伪随机数生成器
1. 几个问题
- 为什么需要随机数?
- 伪随机数伪在哪里?
- 为何要采用伪随机数代替随机数?这种代替是否有不利影响?
- 如何产生(伪)随机数?
以下内容将围绕这几个问题依次说明。
2. 参考
http://en.wikipedia.org/wiki/Monte_Carlo_method
Monte Carlo Statistical Methods, Christian Robert and George Casella, 2004, Springer-Verlag
3. 蒙特卡罗方法
Wikipedia中介绍蒙特卡罗方法由以下几个步骤组成
Define a domain of possible inputs.
Generate inputs randomly from a probability distribution over the domain.
Perform a deterministic computation on the inputs.
Aggregate the results.
简而言之,就是产生满足一定要求的随机序列(数)作为一确定过程的输入并计算结果。一旦我们确定了需要完成某项任务,那么这个确定过程就变成确知的了。问题在于得到“满足一定要求”的随机序列。
也就是说,在蒙特卡洛方法中,随机数起到了至关重要的作用。
4.“伪”随机数
既然叫做“伪”随机数,那么这个过程显然就不是随机的了。尽管其表现形式可能比较随机,但其实际上是一确定性的过程。对于一个[0,1]之间的均匀分布伪随机数生成器来说,我们有以下定义来消除确定性和随机性之间的矛盾。
[定义]
如果一个算法能够从一个初始取值u以及变换D,产生序列u_i = D_i(u),使得对于所有的n,取值(u_1,u_2,..,u_n)是均匀分布随机过程的独立同分布采样(V_1,V_2...V_n)的复制(在一定测试方法下对比)。那么这个算法被称为均匀分布伪随机数生成器。
定义中并没有给出具体的测试方法。一旦给出了测试方法,我们就能够确定产生的确定序列是否能被称为伪随机数了。MCSM中提供了几种方法,包括Kolmogorov-Smirnov test,ARMA test,Die Hard test。如果算法产生的数据通过了测试,那么就称之为均匀分布伪随机数生成器。
但是这一理论还是有一些问题的。算法中一些隐藏的可预测性可能很难被检测出来,这可能会导致错误的实验结果。(这一问题是否得到解决?如何解决这一问题?)
以上定义是基于[0,1]之间的均匀分布做出的,对于其他分布
而言,定义

如果
,那么随机变量
服从
。也就是说,通过均匀分布随机数,可以得到满足其他分布的随机数。
5. 问题
为何要采用伪随机数代替随机数?简单,我们基本上不可能采用计算机产生无穷多的真随机数,而伪随机数在特定准则下和真随机数具有相同的性质,而且容易产生任意多的伪随机数。
这种代替是否有不利影响?可能有,这是因为伪随机数实际上是确定的,可能面临以下几个问题:人们可以通过已有的伪随机数预测下一个值(破解);伪随机数可能还是具有一些没有被测试出来的相关性;如果初始状态一致,会产生一样的序列。
对于第三个问题,一个例子是每次打开MATLAB后,产生的伪随机数是一样的(寄存器复位到相同值)。但我们可以通过改变寄存器的取值来控制,譬如采用
rng('shuffle');
6. 产生特定分布的(伪)随机数
最简单的有统计程序包(Gauss,Mathematic,MATLAB,R,Splus),通过这些程序包,我们不需要自己写伪随机数发生器。
当然,在一些特殊的情况下,也可以自己写随机数发生器。更多的情况是,程序包中的函数不能够产生我们所需要的函数,但我们可以通过已知分布的随机序列产生我们所需要分布的随机序列。通过一些变换或是逆变换可以得到这些分布的随机序列。然而更通常的情况是,很多分布的形式很难或是根本不可能通过逆变换直接得到,甚至有时无法将分布的形式表示出来。在这种情况下,接受-拒绝法出现了。
算法(接受-拒绝法)
1. Generate 
2. Accept
if 
3. Ruturn to 1. otherwise.
这一思想大抵来源于这个等式

也就是说将其转换为两个变量的联合概率分布,此时需要求的是边缘概率

当然,还需要一些其他的思想。因为上面的联合分布的随机数还是找不出来。我们可以到一个更大的集合上去找,之后选择满足约束的随机数。这是从下式得到的

其中



还有一些改进的方法。
[MCSM]伪随机数和伪随机数生成器的更多相关文章
- Atitit.手机验证码的破解---伪随机数
Atitit.手机验证码的破解---伪随机数 1. 手机验证码几乎都是伪随机数1 2. 伪随机数1 2.1. 生成方法编辑1 2.2. 随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安 ...
- [MCSM] Slice Sampler
1. 引言 之前介绍的MCMC算法都具有一般性和通用性(这里指Metropolis-Hasting 算法),但也存在一些特殊的依赖于仿真分布特征的MCMC方法.在介绍这一类算法(指Gibbs samp ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器 本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...
- 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 开源Math.NET基础数学类库使用(14)C#生成安全的随机数
原文:[原创]开源Math.NET基础数学类库使用(14)C#生成安全的随机数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/ ...
- 开源Math.NET基础数学类库使用(12)C#随机数扩展方法
原文:[原创]开源Math.NET基础数学类库使用(12)C#随机数扩展方法 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- C++入门
<完美C++>第5版 (美)Walter Savitch,Kenrick Mock 萨维奇//默克 著 薛正华,沈庚,韦远科 译 出版社: 电子工业出版社 时间2019/4/11- ...
随机推荐
- Cross-Origin Resource Sharing协议介绍
传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求.浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本.但是Javascript脚 ...
- 文件件监听器,android系统拍照功能调用后删除系统生成的照片
先说说要实现的功能: android调用系统拍照功能实时 预览 删除 上传 保存 (用户不能再本地文件夹中看到拍的照片) 再说说遇到的问题: 1.调用系统拍照在系统自带的拍照文件夹中生成一张随机命名图 ...
- 不要轻易使用linq代替sql
使用Entityframework+Reposity模式 写出的代码执行效率极低. Linq代码: var querySql = rel_project_personservice.GetItems( ...
- ASP.NET Core 1.0 安装并发布到Centos 7.2 使用jexus 5.8.2
安装运行环境 sudoyuminstall libunwind libicu 下载.net core https://www.microsoft.com/net/download 下载完后上传文件 安 ...
- 四、Android学习第四天——JAVA基础回顾(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...
- eclipse设置显示代码行数(转)
(转自:http://jingyan.baidu.com/article/b2c186c89b7023c46ef6ff27.html) 载入eclipse的主页面,默认以英文版的eclipse为例 点 ...
- 将treeview控件内容导出图片
项目中有一项需求,需要将项目中的treeview控件展示的树状结构直接导成一张图片.网上方法很多,但很多都是屏幕截屏,我的解决思路是新建一个用户控件,将主窗体的Treeview的数据传给用户控件(不要 ...
- 《Invert》开发日志01:核心玩法设计
前面提过,这个游戏的核心玩法基于我做的第一个Unity游戏,名字就叫<Invert>,现在在应用宝上面还能搜到.不过那个游戏也不是我原创的,它的玩法设计来自github上的一个开源项目(h ...
- 【温故而知新-Javascript】使用 Ajax(续)
1. 准备向服务器发送数据 Ajax 最常见的一大用途是向服务器发送数据.最典型的情况是从 客户端发送表单数据,即用户在form元素所含的各个 input 元素里输入的值.下面代码展示了一张简单的表单 ...
- 基于SPSS的美国老年夏季运动会运动员数据分析
本文是课程训练的报告,部分图片由于格式原因并没有贴出,有兴趣者阅读完整报告者输入以下链接 http://files.cnblogs.com/files/liugl7/基于SPSS的老 ...