注意:现在计算机产生的随机数都是伪随机数。
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
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
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
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()
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);
X2 = sqrt(-2*log(U1)) * sin(2*PI*U2);
那么 X1, X2 服从 N(0,1) 分布,且相互独立。等于说我们用两个独立的 U(0,1) 随机数得到了
两个独立的 N(0,1)随机数。
值得说明的是,该方法产生的随机数质量很高。嘻嘻,本人亲自验证过。
值得说明的是,该方法产生的随机数质量很高。嘻嘻,本人亲自验证过。

浙公网安备 33010602011771号