如何使用Random()运行子例程 我试图将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
在代码的顶部,有以下内容如何使用Random()运行子例程 我试图将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,fortran,cygwin,fortran77,Fortran,Cygwin,Fortran77,在代码的顶部,有以下内容 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): unde
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
如何运行此代码 忽略高斯分布的这种方法效率非常低的事实,您可以使用
call random_number(rran)
rran = rran - 0.5
所以
代码仍然包含一些难看的东西,但当您将其转换为另一种语言时
如果您的目的是在新代码中准确地复制此方法存在的问题,那么您可以使用此方法。否则,请对高斯随机数使用更好的方法,不要惊讶它会有所不同,因为此子例程中的方法不仅效率低下,而且不精确。好方法的结果会有所不同。您需要提供一个函数
random
。如果要相信这个评论,写一篇应该不难。@francescalus我不懂Fortran。此功能是否包含在“quickdraw.inc”中?您可以使用rand
而不是Random。但是你需要调整代码,它可能是在那里定义的-你有它的来源吗?如果将implicit none
放在中,替换其他implicit
语句,至少会得到一个更有用的编译时错误(而不是链接时)。我强烈建议不要按照建议使用非标准函数rand
。使用random_number
并映射到所需范围的整数。
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