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年从标准语言中删除