回 帖 发 新 帖 刷新版面

主题:新人看不懂一段随机数程序

程序如下,
1.是不是线性同余法?
2.求模时为什么用的双精度,而不是直接用整型
3.程序中的case有何用,ia有何用?
4.是read(5,'(5i8)')?是不是应该是read(5,'(15i8)')?
5.iy为什么要录入15个值
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

回复列表 (共4个回复)

沙发

MOD
Elemental Intrinsic Function (Generic): Returns the remainder when the first argument is divided by the second argument.
Syntax
result = MOD (a, p)
a
 (Input) Must be of type integer or real. 
p
 (Input)Must have the same type and kind parameters as a.
Results
The result type is the same as a. If p is not equal to zero, the value of the result is a- INT( a/ p) * p. If p is equal to zero, the result is undefined.

板凳


ia:

调用时,首次必须令ia=1,键盘输入随机种子初始值;令ia=2,反复调用,通过第ib个种子线性同余法产生随机数;ia=3,重新初始化,此为备用选项,要产生另一组随机数序列时,先令ia=3调用一次,再改变ib值反复调用,即改变了初始种子(前提是键盘输入的初始种子值不同)。

3 楼


4.是read(5,'(5i8)')?是不是应该是read(5,'(15i8)')?

似乎改成read(5,*) 更容易理解,要输入15个值,只是因为定义了initial(15),当然可以把15改小,就不必输入这么多数了,只不过调用时ib不能大于你修改的那个数,种子的选择余地也变小了。

4 楼


恩 谢谢大家~ 我有同学说这是利用双精度mod的不确定性来产生随机数,,应该不是这样的吧。。

我来回复

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