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),通过这些程序包,我们不需要自己写伪随机数发生器。
当然,在一些特殊的情况下,也可以自己写随机数发生器。更多的情况是,程序包中的函数不能够产生我们所需要的函数,但我们可以通过已知分布的随机序列产生我们所需要分布的随机序列。通过一些变换或是逆变换可以得到这些分布的随机序列。然而更通常的情况是,很多分布的形式很难或是根本不可能通过逆变换直接得到,甚至有时无法将分布的形式表示出来。在这种情况下,接受-拒绝法出现了。
算法(接受-拒绝法)
3. Ruturn to 1. otherwise.
这一思想大抵来源于这个等式
也就是说将其转换为两个变量的联合概率分布,此时需要求的是边缘概率
当然,还需要一些其他的思想。因为上面的联合分布的随机数还是找不出来。我们可以到一个更大的集合上去找,之后选择满足约束的随机数。这是从下式得到的
其中
还有一些改进的方法。