std::randomで乱数を作る
BOOSTは, 正式版メルセンヌツイスターを装備しています. 低速ですが非常に精度が高い乱数です. と思っていたら標準仕様になってしまい std::random になりました.
#include <random> unsigned long long seed=5489; std::mt19937_64 engine(seed);// std::mt19937_64 engine; と記述するとデフォルトシードと同じ double result; for (int i = 0; i < 10000; ++i) result = engine(); std::cout << result << std::endl;
これで, 10000番目の乱数値として, 9981545732273789042 が得られます. 乱数の周期は10^6000程度です. seedを変更すると, 「多分」 異なる乱数列が得られます.
- 多分,が嫌な向きは・・・自分で調べてください.「多分」がつかない乱数列は,私はTinyMTとKnuthのどれだったっけ(原論文を探し出して参照)が記憶にあります.BOOSTにはありません?かもしれないが?
特定の分布に従う乱数を作る
特定の分布の乱数は, 元の乱数エンジンから作成します:
#include <random> unsigned long long seed=5489; std::mt19937_64; std::uniform_real_distributiondist(0.0,1.0); double V=dist(engine);// [0,1)の一様乱数 std::normal_distribution gauss(0.0,1.0); double Z=gauss(engine);// 平均0 標準偏差1の正規分布
が得られます.
予測不能な乱数を作る
時刻やデバイスから, 予測不能な乱数を作成します.低速ですので,これをseedに,mt19937などを離党すれば,全体が予測不能な乱数になります.
#include <random>
std::random_device prng;
unsigned long long value=prng();
ETC
そのた