乱数生成ルーチンを変更する

 Ver. 7.2.2より擬似乱数(RND)生成アルゴリズムを変更しました。
 旧バージョンは,2147483647を法,16807を乗数とする乗算合同法により生成される擬似乱数(Park-Miller擬似乱数)を用いていました。
旧版と同じ擬似乱数列が必要な場合は,10000行以降に示すモジュールと110行にあるようなDECLARE文を追加して,RND関数の代わりにRandom関数を呼び出してください。

100 OPTION ARITHMETIC NATIVE
110 DECLARE EXTERNAL FUNCTION math.random
120 DECLARE EXTERNAL SUB math.randomize
130 CALL randomize
140 FOR i=1 TO 10
150    PRINT random
160 NEXT i
170 END
10000 MODULE math
10010 MODULE OPTION ARITHMETIC NATIVE
10020 PUBLIC FUNCTION random
10030 PUBLIC SUB randomize
10040 SHARE NUMERIC seed,a,m
10050 LET seed=54321         ! seedの初期値
10060 LET a=16807
10070 LET m=2147483647
10080 EXTERNAL FUNCTION random
10090    LET seed=MOD(a*seed,m) 
10100    LET random=seed/m
10110 END FUNCTION 
10120 EXTERNAL SUB randomize
10130    DECLARE NUMERIC x
10140    LET seed =ROUND(100*TIME)+1 
10150    LET x=random       ! 1回分の乱数を捨てる
10160 END SUB
10170 END MODULE


同様の手法で,他の種類の擬似乱数を試すことができます。
モジュールの機能を用いて関数呼び出し終了後も残る変数を確保するのが要点です。

なお,汎用DLLを用いて乱数を生成する方法はこちらをご覧ください。


戻る