如何使用Random()运行SUBROUTINE

时间:2017-11-18 06:22:47

标签: fortran cygwin fortran77

我试图将Fortran 77代码转换为C ++。我通过cygwin使用gfortran编译器。我已经成功转换了大部分代码,但由于它依赖于Random(),我无法运行此子程序。根据我读的书,子程序是

SUBROUTINE GAUSS(X,SIG)
    IMPLICIT REAL*8(A-H)
    IMPLICIT REAL*8(O-Z)
    INTEGER SUM
    SUM=0
    DO 14 J=1,6
    C THE NEXT STATEMENT PRODUCES A UNIF. DISTRIBUTED NUMBER FROM -32768 TO +32768
    IRAN=Random()
    SUM=SUM+IRAN
    14 CONTINUE
    X=SUM/65536
    X=1.414*X*SIG
    RETURN
END

在代码的顶部,有以下

C THE FIRST THREE STATEMENTS INVOKE THE ABSOFT RANDOM NUMBER GENERATOR ON THE MACINTOSH
GLOBAL DEFINE
INCLUDE 'quickdraw.inc'
END

使用此行

gfortran -std=legacy Listing_4_3.f90 -o test

我收到了这个错误

/tmp/ccQ2l529.o:Listing_4_3.f90:(.text+0x1b): undefined reference to `random_'
collect2: error: ld returned 1 exit status

如何运行此代码?

1 个答案:

答案 0 :(得分:1)

忽略这种高斯分布方法非常低效的事实,你可以轻松地生成从-0.5到0.5的数字

call random_number(rran)
rran = rran - 0.5

所以

SUBROUTINE GAUSS(X,SIG)
    IMPLICIT REAL*8(A-H)
    IMPLICIT REAL*8(O-Z)
    REAL*8 SUM, RRAN
    INTEGER J
    SUM=0
    DO J=1,6 
      CALL RANDOM_NUMBER(RRAN)   
      RRAN = RRAN - 0.5
      SUM=SUM+RRAN
    END DO
    X = 1.414*SUM*SIG
END

代码仍然包含一些丑陋的东西,但是当你将它转换为另一种语言时......

如果您要在新代码中完全复制此方法存在的问题,可以使用此方法。否则对高斯随机数使用更好的方法,并且不要惊讶它会有所不同,因为这个子程序中的方法不仅效率低,而且不精确。好方法的结果会有所不同。