回 帖 发 新 帖 刷新版面

主题:小白 跪求 一段程序的解释  看不出来为啥能实现随机数

subroutine randomz(ia,ib,x) !伪随机数产生器子程序
implicit none
integer ia,ib
real*8 x
integer,save:: initial(15)
real*8 ,save:: iy(15),iz
selectcase(ia)
case(1) ! 初始
iz=100000001.d0
read(5,'(5i8)') initial
iy=dble(initial)
x=iy(ib)*1.0d-8
case(2) ! 产生随机数
iy(ib)=mod(329.d0*iy(ib),iz)
x=iy(ib)*1.0d-8
case(3) ! 复位为初始iy
iy=dble(initial)
endselect
end

回复列表 (共2个回复)

沙发

subroutine randomz(ia,ib,x) !伪随机数产生器子程序
implicit none
integer ia,ib
real*8 x !返回值
integer,save:: initial(15)
real*8 ,save:: iy(15),iz
selectcase(ia)
case(1) !ia参数为1,从键盘输入种子初始化随机数生成器
iz=100000001.d0
read(5,'(5i8)') initial !从键盘连续读入5个整数(不是15?,似乎应该是15i8)
iy=dble(initial)  !整型数组initial逐项复制给double数组iy,转换成double型
x=iy(ib)*1.0d-8 !将结果归一化到0~1之间再返回,初始值
case(2) ! ia参数为2,产生随机数
iy(ib)=mod(329.d0*iy(ib),iz) 
!算法的主要思想就是“线性同余法”,其基本迭代公式为x(n+1)=(a*x(n)+b)%c,
!在你给的源代码里:a=329.0,b=0.,c=100000001.0
x=iy(ib)*1.0d-8 !将结果归一化到0~1之间再返回
case(3) ! ia参数为3,重新初始化,但还使用原先的种子
iy=dble(initial)
endselect
end

板凳


这个求余时怎么用的是双精度呢??

我来回复

您尚未登录,请登录后再回复。点此登录或注册