2011年5月4日水曜日

乱数発生に関する考察

乱数発生に関する考察です。

Numerical Recipes in C, Second Edition (1992)(7. Random Numbers) に記載されていた、乱数を発生するアルゴリズムに若干の疑念を覚えたので検証するための例題を用意しました。

以下の例題では、上記 random() 関数と、srand/rand 関数による乱数発生のアルゴリズムによる乱数発生の比較を行っています。
乱数発生を繰り返し行い、ヒストグラムを作成し、それに要する時間と平均値、標準偏差を計算しています。

実行結果

例題では、0から99までの乱数を発生する計算を 100×1000 回行っていますが、平均値は双方のアルゴリズム共に 1000 となっています。
その標準偏差を比較すると、random() 関数では srand/rand 関数のアルゴリズムよりも標準偏差が大きく、バラつきが多くなっています。
また、計算時間も srand/rand 関数の方が短くなっています。

ヒストグラムは下記のグラフのようになっています。
グラフでは、私が使っていたアルゴリズムの方(青線)が、最小値/最大値の発生率が低く、そのせいでバラつきが大きい結果になっていることが分かります。

これまで普通に使ってきましたが、標準関数を利用するようにしていかないといけないですね。

以下、同様に Numerical Recipes in C に掲載されていた乱数発生の例です。
上記と同様にヒストグラムを作成した結果、最大最小値の発生率が低くバラつきが大きい結果になりますので、標準関数を利用した方が良い結果になります。

0 件のコメント:

コメントを投稿