BASICのRND関数は,区間[0,1)で一様分布する確率変数とみなせるので,その平均は1/2,分散は1/12です。
したがって,それらを12個加えて6を引けば,平均が0,分散が1の乱数になります。
中心極限定理から,多数個の乱数の和の分布は正規分布の近似になるのですが,一様乱数の和の場合には,12個程度の和でもかなり正規分布に近くなります。
標準正規分布に従う擬似乱数
DEF nrandom=RND+RND+RND+RND+RND+RND+RND+RND+RND+RND+RND+RND-6
平均μ,分散σ2の正規分布N(μ,σ2)に従う乱数は,nrandomをσ倍してμを加えれば得られます。
<補足>
一様乱数から正規乱数を得る方法としては,他に,Box-Muller法が有名です。詳細は書物かインターネットを検索して調べてください。
例 Box-Muller法により1000個の標準正規乱数を得る
100 DECLARE EXTERNAL FUNCTION Box_Muller.NRandom 110 FOR k=1 TO 1000 120 PRINT USING "-%.######":NRandom 130 NEXT k 140 END 1000 MODULE Box_Muller 1010 PUBLIC FUNCTION NRandom 1040 SHARE NUMERIC r,t,s 1090 LET s=0 1100 EXTERNAL FUNCTION NRandom 1150 IF s=0 THEN 1160 LET r=SQR(-2*LOG(1-RND)) 1170 LET t=2*PI*RND 1180 LET NRandom=r*COS(t) 1190 LET s=1 1200 ELSE 1210 LET NRandom=r*SIN(t) 1220 LET s=0 1230 END IF 1240 END FUNCTION 1300 END MODULE
<Note>
十進BASICVer.7.2.2に付属のRANDOM.LIBに,正規乱数,その他,各種乱数を生成する外部関数定義を収録しています。
使用例 正規分布N(50,102)に従う乱数を20個生成する
10 DECLARE EXTERNAL FUNCTION RNDNormal 20 DECLARE NUMERIC m,s,i 30 LET m=50 40 LET s=10 50 RANDOMIZE 60 FOR i=1 TO 20 70 PRINT RNDNormal(m,s) 80 NEXT i 90 END 100 MERGE "random.lib"
RANDOM.LIBは,BASICをインストールしたフォルダのLibraryサブフォルダにあります。