亂數 (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)