スポンサーリンク

C++11以降で正規分布に従う乱数を作るには ~ライブラリを利用して(続き)~

前に書いたライブラリを使った正規分布の作り方記事の続きです。

この記事では、前に出来なかったプログラムの実行結果の確認とか

ソースコードとか、ソースコードの解説、注意点なんかは前回記事をご覧くださいませ~。

スポンサーリンク

プログラムの実行結果

実行結果は、PSEUDO_RANDOM_NUMBER.csvという名前のファイルに書き込まれているかと思います。そのファイルを確認していきます。

Excelなんかでファイルを開いていただければ、Aの列に環境依存の非決定論的な乱数が、Bの列に今回のテーマである正規分布に従う乱数が書き込まれているはずです。ちなみに、僕の環境ではこんな感じになりました(ファイル名の競合を避けるためにファイル名は少し変えていますが、中身は出力されたままのものが書き込まれています)。

それをヒストグラムに直したものが下の画像になります。-1.0から順に0.2刻みで、出現した乱数の個数を数えました。

グラフの見方は、横軸が乱数の値で、縦軸が横軸で指定した範囲内の数値が出現した回数になります。各棒の上にある数字は出現回数を表していて、横軸の下に書いてあるラベルは左の数値以上、右の数値未満の範囲内にあるデータであることを表しています。

例えば、横軸の左から3つ目にある”-0.6″-“-0.4″という部分では、-0.6以上で-0.4未満の数値が11個あるということを表しています。

結果を確認してみると確かに正規分布になってい(るように見え)ますね。

\( 1.0 \pm 2 \)の範囲にある数値をカウントしていますが、平均値が1.0、分散が0.5という指定をしていたので、理論上は\( 1.0 \pm 3 \sqrt{0.5} \)の範囲内に出力した全乱数の99.7%が存在するので、その範囲内にある数値だけを数えました。まぁ、今回は100%がその範囲内に収まっていてくれましたが。

プログラムを実行するたびに違った乱数列が得られて、ぱっと見はちゃんと乱数になってそうなので、プログラムは問題なく動いてそうです。

このライブラリを使えば他にも二項分布とかポアソン分布とか、正規分布以外に従う乱数も作れるみたいで、色んな乱数を同じような表記で作れるという意味では便利そうです。実用性があるかどうかは分かりませんが。

終わり

というわけで、正規分布に従う乱数はC++11以降であれば

  random_device seed_gen;
  mt19937 engine(seed_gen());
  normal_distribution<> dist(1.0, 0.5);
  double rand = dist(engine);

という3ステップで作れますよーという話でした。

タイトルとURLをコピーしました