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]伪随机数和伪随机数生成器的更多相关文章

  1. Atitit.手机验证码的破解---伪随机数

    Atitit.手机验证码的破解---伪随机数 1. 手机验证码几乎都是伪随机数1 2. 伪随机数1 2.1. 生成方法编辑1 2.2. 随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安 ...

  2. [MCSM] Slice Sampler

    1. 引言 之前介绍的MCMC算法都具有一般性和通用性(这里指Metropolis-Hasting 算法),但也存在一些特殊的依赖于仿真分布特征的MCMC方法.在介绍这一类算法(指Gibbs samp ...

  3. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  4. 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

    原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器                本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...

  5. 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  6. 【原创】开源Math.NET基础数学类库使用(14)C#生成安全的随机数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  7. 开源Math.NET基础数学类库使用(14)C#生成安全的随机数

    原文:[原创]开源Math.NET基础数学类库使用(14)C#生成安全的随机数                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/ ...

  8. 开源Math.NET基础数学类库使用(12)C#随机数扩展方法

    原文:[原创]开源Math.NET基础数学类库使用(12)C#随机数扩展方法                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...

  9. C++入门

    <完美C++>第5版 (美)Walter Savitch,Kenrick Mock 萨维奇//默克 著  薛正华,沈庚,韦远科 译    出版社: 电子工业出版社 时间2019/4/11- ...

随机推荐

  1. pentaho cde 封装自定义图形控件,动态传参

    在实际项目中经常会用到将经常用到的图形表格组成一个控件,其他地方直接调用,类似于服务器开发的接口,而现在就需要将一些常用的图形做封装,这样就不必重复多次创建相同的内容. 下面就简单的定义一个自定义柱形 ...

  2. jQuery自动完成组建Autocomplete

    一,属性介绍 * minChars (Number) 在触发autoComplete前用户至少需要输入的字符数.Default: 1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表* wid ...

  3. Nginx 切片模块、断点续传

    熟悉 CDN 行业主流技术的朋友应该都比较清楚,虽然 Nginx 近几年发展的如日中天,但是基本上没有直接使用它自带的 proxy_cache 模块来做缓存的,原因有很多,例如下面几个: 不支持多盘 ...

  4. 用wget扒站时遇到电信劫持

    今天用wget扒下来一个html template的站. 挂在自己机器上后随便点什么,都出电信广告.仔细检查,我勒个去... 扒站过程中,刚好被电信打了劫,看看它给我下载下来的bootstrap.mi ...

  5. dpkg

    dpkg是debian最早提出的一个软件包管理工具,因为早期并没有考虑到当下软件包之间这么复杂的依赖关系,所以并不能自动解决软件包的依赖问题,这个命令多用于安装本地的.deb软件包,也可以进行软件包的 ...

  6. ipcs, ipcrm

    ipcs ipcs -m #查看系统中已经存在的共享内存 ------ Shared Memory Segments -------- key shmid owner perms bytes natt ...

  7. Java Hello World例子和添加按钮事件与功能

    新建android工程,然后默认“下一步”即可完成创建: 2.添加Button 3.在src的MainActivity.java添加以下红色代码 import android.support.v7.a ...

  8. 发现struct proc_dir_entry内核3.10.17移到internal中去了,倒

    struct proc_dir_entry 原:2.6.38.8 在#include <linux/proc_fs.h> 现:3.10.17 在fs/proc/internal.h:str ...

  9. 初试MarkDown

    · 要写个文档,突然就想到要不要试试学学MarkDown,整理一下大致过程 · 首先搜到这篇文章 ,简单介绍了MarkDown,以及OS X 平台上一个简单的工具 mou (目前仍免费) 相关新闻不做 ...

  10. spring注入静态成员变量提示invalid setter method

    果然还是不够细心啊,被坑一晚上.. 一个极其简单的小程序,但是需要通过xml文件配置注入一个值,唯一的特别是要注入的属性是类中的静态成员变量.. 如下,然后自动生成get和set方法..坑就从此开始了 ...