亂數 (random number) 數列是一串表面上雜亂無章的數字。 數字重複出現的周期必須很長, 而且前後數字似無關聯。 均勻分佈 (uniformly distributed) 的亂數數列,可用下列式子產生

X n+1 = (aX n + c) mod m, n>=0

式中初值 X 0 , 乘數 a, 增數 c 均不為負, 而且都小於模數

適當選擇 X 0 , a, c, 和 m 值, 即可產生亂數。 以 32 bits 的計算機為例, 可取 a=3612, c=5701, m=566927。(ref. 3, p.335)

產生亂數的方法有好幾種,這種方法稱為線性同餘法 (linear congruential method)。

FORTRAN 90 -- 使用下列 副程式 產生亂數: CALL RANDOM(X) 產生(0,1)亂數X CALL RANDOMSEED 設定亂數產生

References

程式之秘:演算法(一)
  • D.E. Knuth, The Art of Computer Programming: Seminumerical Algorithms, vol.2, Ch.3, Addison-Wesley, 1969.
  • L.P. Meissner and E.I. Organick, FORTRAN 77, Ch.10, Addison-Wesley, 1980.
  • 敘述函數 Statement Function

    假如函數可用單一式子界定,則可採用敘述函數定義。

    name ( x1, x2, ... , xn ) = expr

    POISS(LAMBDA, N) = (LAMBDA ** N * EXP(-LAMBDA)) / FACTOR(N) HADDER(Binary Half Adder) (source)

    5.2 數值方法:求根

    Bisection method

    BISECT (source)

    Newton's method

    NEWTON (source)

    5.3 數值方法:積分

    AREA: Rectangle approximation of an integral -- version 1 (source)

    5.5 Subroutine 副程式

    SUBROUTINE 副程式的定義格式如下

    SUBROUTINE name ( x1, x2, ... , xn )

  • name 是此副程式的名稱,其命名方式和變數名稱一樣。
  • x1, x2, ... , xn 是此副程式的形式引數。
  • SUBROUTINE 副程式也是一個完整的程式,它和 FUNCTION 副程式不同之處如下

  • FUNCTION 副程式執行後所得的函數值,送回 CALL 它的程式。 SUBROUTINE 副程式可送回一個或多個值,甚至只進行某些工作而沒有值送回。
  • SUBROUTINE 副程式之名稱不代表任何值,只是做為識別之用,數值是經由引數送回。 FUNCTION 副程式之名稱代表函數值。
  • 使用SUBROUTINE 副程式用 CALL 敘述,使用FUNCTION 副程式用函數名稱。 CALL PRNDEG(DEGS, MINUTS, SECONS) 的副程式中使用,這樣的傳送方式就很不方便。 這時適合使用 COMMON 敘述。 COMMON 敘述用以在程式中指定 某些特定的儲存位置為共用區,而各份程式都可直接使用此共用區的儲存位置。

    COMMON 敘述的形式有兩種

  • Blank COMMON
  • Named COMMON
  • Blank COMMON

    COMMON list

    使用COMMON 敘述的項目,必須注意事項

  • 相對應項目的型式必須相同。
  • 假如項目的型式是 CHARACTER,其長度(即字元數)必須相同。
  • 在使用COMMON 敘述的副程式中,COMMON 敘述的項目不可用做形式引數。
  • POLAR: Coordinate Conversion -- version 2 (source)

    Named COMMON

    COMMON /name-1/ list-1 /name-2/ list-2 ...

    FORTRAN 90 -- FUNCTION 和 SUBROUTINE 副程式都可以使用 遞迥式(recursive),例如 RECURSIVE FUNCTION FACTORIAL(N) RESULT(FACT) INTEGER FACTORIAL, RESULT, N IF (N<1) THEN FACT = 1 FACT = N * FACTORIAL(N-1)