上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年开发。该方法基于有限二进制字段上的矩阵线性再生,快速产生高质量的伪随机数。