! normal distributied set of random numbers.txt ! ! (十進BASIC ソース): 全文コピーして実行してください。 ! ! 正規分布に従う乱数を発生させるプログラムです。 ! エクセルシートに貼り付けることに対応して、 ! 行、列を指定した(行内カンマ区切り)形式で出力できます。 ! ! Box-Muller 法に比べて、計算量に無駄がありますが、 ! 数学的な素養にたよらずとも明示的でわかりやすいアルゴリズムとしました。 ! ! 1E6 個の出力結果にもとづいた乱数の分布の評価結果等については ! 「群馬高専レビュー」第37号、p53〜 ! http://www.gunma-ct.ac.jp/gakko/pdf/review/review37.pdf ! をご参照ください。 ! ! ! ! ! ※ 本アルゴリズムは、十進BASIC の RND 関数による疑似乱数を利用しています。 ! 十進BASIC ではメルセンヌツイスタ法により、50ビットの精度で ! 0 以上 1 未満の範囲で一様分布に従う、非常に質の高い疑似乱数系列を得ることができます。 ! ! 十進BASIC は、以下のURIより入手してください。 ! http://hp.vector.co.jp/authors/VA008683/ ! ! 2019. opend ! S. Nakajima ! ! 標準正規分布に従う乱数の発生 DEF f(x) =1/(SQR(2*PI)*sigma) * EXP(-(x-mu)^2/2/sigma^2) LET sigma = 1 ! 標準偏差 LET mu = 0 ! 平均 LET GroupNumber = 1 ! ※1 LET SampleSize = 500 ! ※2 LET DataNumber = GroupNumber * SampleSize ! ※3 LET Fmax = F(mu) RANDOMIZE ! ※4 FOR j = 1 TO DataNumber LET flag = 0 ! ※7 DO LET k = (RND-0.5)*2 *10 * sigma + mu ! ※5 LET m = RND IF f(k)/Fmax > m THEN ! ※6 PRINT k; IF INT(j/GroupNumber)=j/GroupNumber THEN print ELSE PRINT ","; END IF LET flag = 1 ! ※7 END IF LOOP UNTIL flag = 1 NEXT j END ! ※1 発生させたデータをカンマ区切りテキストとして出力する場合の、列数。標本の数。 ! ※2 列データの行数。標本の大きさ。 ! ※3 発生させるデータの全数。 ! ※4 疑似乱数 RND において、乱数系列の出発点を予測できなくするための命令文。この1行がなければ、乱数系列の出発点がいつも同じになり、繰り返して実行しても同じ出力結果を与える。 ! ※5 mu ± 10 sigma の範囲内で、均等に乱数を発生。 x = (RND-0.5) は {-0.5≦x<0.5} の範囲の乱数を与えることに注意すること。 ! ※6 発生した乱数kを採用するかどうかの決定。別に発生させた乱数 m を正規分布関数f(k)と比較することで決定する。これにより、確率密度に比例した頻度で乱数を採用することになる。 ! ※7 発生したkを採用するまで、Do 〜 Loop を繰り返すためのフラグ。