乱数発生器のメルセンヌ・ツイスターは有名ですが。
C++11には標準でメルセンヌ・ツイスターのライブラリーが入ってるんですよね。調べてみたら正規分布も生成できるんだ。
でもC++のテンプレートやらなんやらわからんし。
と、とりあえず適当にあちこちからひろってくっつけてみました。
#include <iostream>
#include <random>
int main(){
std::random_device rd;
std::mt19937 mt(rd());
std::normal_distribution<> d(5.0,3.0);
for(int i=0;i<1000000;i++){
std::cout << d(mt) << "\n";
}
}
最初、clang コマンドでコンパイルしようとしてうまく行かなかったのではまっていたのですが、何のことはない、clang++ コマンドで次のようにすることでコンパイルできました。(ファイル名を mt.cc としました。)
$ clang++ -std=c++11 mt.cc
100万回、平均値5、標準偏差3の正規乱数を出力してくれます。clang++ のかわりに g++ でもいっしょです。デフォルトではC++11 にならないので、オプションをつけないとだめみたいです。
std::random_device は機器の温度とかのモニターで生成する予測不能な乱数らしいのですが、機械的に結果を出力するため遅いらしいです。そのため乱数の種の生成に使われるんだと。
std::mt19937 がメルセンヌ・ツイスター 19937。
std::normal_distribution が正規分布を作るテンプレートらしいです。
Libreoffice にはりつけて分布解析してみましたが、100万回やると、なんとなくそれっぽい分布になってる感じでした。
でも100万回じゃ少々足りないっぽいなぁ。Libreoffice だとそんなに貼りつけられなかったのでこれ以上はやっていませんが、R とかで分析すればいいのかな? 本当は。
どのぐらいでサチるのかわかりませんが。。。
メルセンヌ・ツイスターの理屈はさっぱりわからないのですが。
あと、この結果を Fortran のプログラムに組み込む方法を考えなきゃ。
はじめて動く C++ のソース書いたわ。(ほとんどコピペだけど。。。)