首页 > 解决方案 > 如何制作fortran随机数

问题描述

我想在不使用函数的情况下制作 rand 数

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*8integer>>integer*8

但每次尝试都失败了......

什么是问题?

在此处输入图像描述

标签: randomfortran

解决方案


您的问题是您甚至需要常量才能具有特定类型。这是您需要做的:

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

等等。附加的_int64(在您从iso_fortran_env模块中导入它之后)告诉编译器将此数字视为 64 位整数。除了线use, intrinsic :: iso_fortran_env,您还可以使用线

INTEGER, PARAMETER :: int64 = selected_int_kind(19)
INTEGER, PARAMETER :: real64 = selected_real_kind(r=300)

IMPLICIT NONE当然,在 之后。)

也就是说,您使用这种过时的 Fortran 语法是否有原因?

任何不包含该行的 Fortran 程序implicit none都是可疑的。然后你使用语法

do 5 i = 1, n
...
5 continue

有什么问题

do i = 1, n
...
end do

接着

if (ibmo) 101, 102, 102

那是我什至不认识的语法。


推荐阅读