Julia语言程序设计
上QQ阅读APP看书,第一时间看更新

3.6 随机数

随机地生成数值,在许多场景中会用到,比如模拟中奖这种随机事件,或者蒙特卡罗(Monte Carlo)仿真等。但通过计算机生成随机数是一件很有挑战性的事,因为计算机的特点是一切都需要是明确的。科学家们发明了多种方法,制作出了各种伪随机数发生器(Random Number Generator,RNG),其中的马特赛特旋转演算法[1]是Julia默认采用的方法。

提示 如果开发者不愿意使用该RNG,可以借助AbstractRNG类加入新的RNG,以便使用。

另外,因为随机数模拟的实际是某个随机事件,所以也与统计分布相关,即大量的随机数序列会呈现某种数学分布特性,比如均匀分布、正态分布或指数分布等。Julia能够按照要求生成特定分布特性的随机数序列,并且还可以支持不同的数值类型,下面以浮点型为例,分别介绍三种常见分布的随机数生成方法。

1.均匀分布随机数

函数rand()用于生成均匀分布的随机数。对于浮点类型来说,该函数生成的随机数所处的区间是[0,1),即小于1大于等于0的浮点数。例如:


julia> rand()
0.003594517966796884

julia> rand()
0.05602819264146208

julia> rand()
0.8497003282422178

如上所示,按照相同的方式反复地调用同一个函数,每次都会获得不同的数值,即获得了需要的随机序列。

2.正态分布随机数

函数randn()则是用于生成均值为0,方差为1的正态分布中的随机数,例如:


julia> randn()
1.2632927170077926

julia> randn()
-1.2236714132749305

julia> randn()
0.4294006067651739

3.指数分布随机数

函数randexp()用于生成符合指数分布的随机数,例如:


julia> randexp()
1.6622581377218693

julia> randexp()
0.768276340842417

julia> randexp()
0.3918476058681037

关于随机生成函数的更多用法,可参见相关文档,这里不再赘述。

[1] 马特赛特旋转演算法(Mersenne Twister Library),由Makoto Matsumoto(松本)和Takuji Nishimura(西村)于1997年开发。该方法基于有限二进制字段上的矩阵线性再生,快速产生高质量的伪随机数。