分享

Fortran 产生随机数方法介绍(附代码)

 Secelia 2012-11-02

注意:现在计算机产生的随机数都是伪随机数。

1.0-1之间均匀分布的随机数
random_number(x) 产生一个0到1之间的随机数(x可以是向量),但是每次总是那几个数。
用了random_seed ()后,系统根据日期和时间随机地提供种子,使得随机数更随机了。
program random
implicit none
real :: x
call random_seed () ! 系统根据日期和时间随机地提供种子
call random_number (x) ! 每次的随机数就都不一样了
write(*,*) x
stop
end program random


2.任意区间均匀分布的随机数
function my_random (lbound,ubound)
implicit none
real :: lbound,ubound
real :: len
real :: my_random
real :: t


len=ubound-lbound !计算范围大小
call random_number(t) !t是0-1之间的随机数
my_random=lbound+len*t

return
end

注意:在循环外call random_seed()

3.产生一个随机数数组,只需加一个循环即可
function my_random (lbound,ubound)
implicit none
real :: lbound,ubound
real :: len
integer size
real :: my_random(size) !size代表数组元素的个数
real :: t
integer i
len=ubound-lbound !计算范围大小
do i=1,10
call random_number(t) !t是0-1之间的随机数
my_random(i)=lbound+len*t !把t转换成lbound-ubound间的随机数
end do

return
end
注意:同理在循环外call random_seed()

4.标准正态分布随机数/高斯分布随机数

(1)徐士良的那本程序集里介绍了正态分布随机数产生的原理,不过他的方法只能产生较为简

单的随机数,随机数的质量并不高,特别是随机数的数目较多时。


(2)Box 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法。

设 U1, U2 是区间 (0, 1) 上均匀分布的随机变量,且相互独立。令

X1 = sqrt(-2*log(U1)) * cos(2*PI*U2);
X2 = sqrt(-2*log(U1)) * sin(2*PI*U2);

那么 X1, X2 服从 N(0,1) 分布,且相互独立。等于说我们用两个独立的 U(0,1) 随机数得到了

两个独立的 N(0,1)随机数。
值得说明的是,该方法产生的随机数质量很高。嘻嘻,本人亲自验证过。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多