今日はC言語を使って乱数を発生させる方法をいろいろと紹介します。
まずは以前お伝えした乱数発生法をおさらいしましょう。
基本的なことですが、C言語による擬似乱数の発生にはrand()関数を用います。
#include <stdlib> #include <time>/* ここからは関数内に記述 */ srand((unsigned)time(NULL)); //乱数の初期化 rand(); // 乱数を発生
これだけ。
次に、正規分布に従う乱数を発生させる方法を紹介します。
これは、正規乱数と呼ばれています。
代表的な方法にはボックス・ミュラー法があります。
ボックス・ミュラー法とは、
2つの一様乱数 U1,U2があるとき、
Z1 = (-2logeU1)1/2cos2πU2
Z2 = (-2logeU1)1/2sin2πU2
で得られるZ1,Z2は標準正規分布(平均値0,標準偏差1)に従う互いに独立な正規乱数となります。
この乱数の発生頻度を表すと釣り鐘のような形のグラフ(いわゆる正規分布のグラフ)になります。
参考:Box-Muller Transformation
そこで、上のボックス・ミュラー法を拡張して、平均m,標準偏差σの正規分布N(m,σ)に従う乱数の発生方法を書いてみます。
#include <stdlib> #include <math> #include <time> #define PI 3.14159265358979 /* 円周率 *//* ここからは関数内に書いてください。 */ /* box and muller法 */ double sigma; // 標準偏差σに対応 double r1,r2; double Z1,Z2; srand((unsigned)time(NULL)); //乱数の初期化 r1=rand()/RAND_MAX; r2=rand()/RAND_MAX; Z1=sigma*sqrt(-2*log(r1))*cos(2*PI*r2)+m; // x成分 Z2=sigma*sqrt(-2*log(r1))*sin(2*PI*r2)+m; // y成分
こんな形で書くことが明確で高速な方法だそうです。
正規乱数を必要とした場合には是非ご活用ください。
他にもc言語が慣れてきてプログラミング技術を磨きたいと思われた方はこちらをおすすめします。
