2013-03-05 71 views
0

我採取了以下功能ran0從文本數字食譜。我寫了我自己的程序random2致電ran0爲什麼此Fortran隨機數生成器會導致分段錯誤?

爲什麼此代碼會導致分段錯誤?謝謝你的時間。

FUNCTION ran0(idum) 
    INTEGER idum,IA,IM,IQ,IR,MASK 
    REAL ran0,AM 
    PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,MASK=123459876) 
    INTEGER k 
    idum=ieor(idum,MASK) 
    k=idum/IQ 
    idum=IA*(idum-k*IQ)-IR*k 
    if (idum.lt.0) idum=idum+IM 
    ran0=AM*idum 
    idum=ieor(idum,MASK) 
    return 
END FUNCTION 

PROGRAM random2 
    IMPLICIT NONE 
    REAL :: ran0 
    PRINT *, ran0(6) 
END PROGRAM 
+4

不要這樣做。數值型隨機數發生器都不是很好,而且上面的ran0是一個具有相關性和短週期的線性同餘發生器。 gfortran和ifort中的'random_number()'內部函數都是非常穩定的實現,當然比上述任何一種指標都更好,並且有很多庫可供您下載,編譯和使用(http:// www。 agner.org/random/,http://www.iro.umontreal.ca/~simardr/testu01/tu01.html)如果您需要這些,可以實施更好的PRNG。如果您的計算需要PRNG,請使用好的。 – 2013-03-05 22:48:35

回答

5

將常量6.0作爲IDUM僞參數傳遞給函數。然後,您(嘗試)使用idum = ieor(...)等行修改此參數。您正在有效地嘗試修改常量。

6.0的值已經修正了一段時間 - 足夠長的時間,大多數程序員希望找到它在5.0到7.0之間。請不要嘗試改變它。

2

擴展IanH的答案,如果部分重寫對此進行了更現代的Fortran:

module my_subs 

contains 

FUNCTION ran0(idum) 
    INTEGER, intent(inout) :: idum 
    INTEGER IA,IM,IQ,IR,MASK 
    REAL ran0,AM 
    PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,MASK=123459876) 
    INTEGER k 
    idum=ieor(idum,MASK) 
    k=idum/IQ 
    idum=IA*(idum-k*IQ)-IR*k 
    if (idum.lt.0) idum=idum+IM 
    ran0=AM*idum 
    idum=ieor(idum,MASK) 
    return 
END FUNCTION 

end module my_subs 

PROGRAM random2 
    use my_subs 
    IMPLICIT NONE 
    !REAL :: ran0 
    PRINT *, ran0(6) 
END PROGRAM 

識別參數作爲輸入和輸出與intent(inout)屬性,並把子程序模塊中,並使用模塊允許編譯器檢查參數的一致性,編譯器很可能會發現這個問題。例如,gfortran輸出:

PRINT *, ran0(6) 
       1 
Error: Non-variable expression in variable definition context (actual argument to INTENT = OUT/INOUT) at (1) 
相關問題