Random 如何生成fortran随机数
我想在不使用函数的情况下生成随机数Random 如何生成fortran随机数,random,fortran,Random,Fortran,我想在不使用函数的情况下生成随机数 PROGRAM RTEST PARAMETER (N=100) IMPLICIT REAL(A-H,O-Z), INTEGER(I-N) DIMENSION A(N) OPEN(99,FILE='RANDOM.DAT',FORM='FORMATTED') IBMO=3149 SUM=0.0 DO 5 I=1,N IBMO=IBMO*65549 IF(IBMO) 101, 102, 102 101 IBMO=IBMO+21
PROGRAM RTEST
PARAMETER (N=100)
IMPLICIT REAL(A-H,O-Z), INTEGER(I-N)
DIMENSION A(N)
OPEN(99,FILE='RANDOM.DAT',FORM='FORMATTED')
IBMO=3149
SUM=0.0
DO 5 I=1,N
IBMO=IBMO*65549
IF(IBMO) 101, 102, 102
101 IBMO=IBMO+2147483647+1
102 RANDOM=0.46566128E-9*IBMO
A(I)=RANDOM
WRITE(99,10)I,A(I)
WRITE(6,10) I,A(I)
10 FORMAT(5X,I4,3X,F12.7)
SUM=SUM+A(I)
AVE1=SUM/FLOAT(N)
20 FORMAT(12X,F12.7)
30 FORMAT(5X,I4,3X,F12.7)
WRITE(6,20) AVE1
WRITE(99,30)I,AVE1
5 CONTINUE
CLOSE(99)
AVE=SUM/FLOAT(N)
WRITE(6,*)AVE
PAUSE
STOP
END
但我总是遇到整数溢出或无效浮点错误
所以我认为是类型错误
我尝试更改real
>real*8
和integer
>integer*8
但每次尝试都失败了
问题是什么
您的问题是,您甚至需要常数才能拥有特定的类型。 以下是您需要做的:
PROGRAM RTEST
USE, INTRINSIC :: ISO_FORTRAN_ENV, ONLY: int64, real64
IMPLICIT NONE
INTEGER, PARAMETER :: N = 100
REAL(KIND=real64) :: A(N)
INTEGER(KIND=int64) :: IBMO
...
IBMO = IBMO * 65549_int64
IBMO = IBMO + 2147483648_int64
等等。附加的\u int64
(从iso\u fortran\u env
模块导入后)告诉编译器将该数字视为64位整数。除了行use之外,您还可以使用以下行
INTEGER, PARAMETER :: int64 = selected_int_kind(19)
INTEGER, PARAMETER :: real64 = selected_real_kind(r=300)
(当然,在隐式NONE
之后。)
也就是说,您使用如此过时的Fortran语法有什么原因吗
任何不包含行implicit none
的Fortran程序都是可疑的。那么您使用的是语法
do 5 i = 1, n
...
5 continue
你怎么了
do i = 1, n
...
end do
然后
if (ibmo) 101, 102, 102
这是我甚至都不认识的语法。您从哪里得到“无效浮点错误”,请尝试使用调试选项(如-g
)进行编译,以便获得堆栈跟踪。为什么不使用标准的Fortran函数RANDOM\u INIT
,RANDOM\u SEED
和RANDOM\u NUMBER
?我添加了这个例子!如果(ibmo)101,102,102是如果ibmo<0转到101如果ibmo==0转到102如果ibmo>0转到102我从我的老教授那里学到了这个fortran grmmar。。。然后在韩国,我们没有足够的数据或信息来学习fortran,所以我只使用我所学的…它被称为“算术如果”。它在1978年是过时的,从那时起就不应该被使用,并在2018年从标准语言中删除