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)随机数。
值得说明的是,该方法产生的随机数质量很高。嘻嘻,本人亲自验证过。