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を用いて乱数を生成する方法はこちらをご覧ください。