メインコンテンツに移動

乱数

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_distribution dist(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

そのた