c++
C/C++では整数の乱数を C言語では
rand() / RAND_MAX
で[0.0, 1.0)の一様分布が生成できた。C++では整数の乱数をもとに所望の分布に加工して出してくれる クラスが用意されているので、これを使うとよい。
例えばdoubleの一様分布なら
std::uniform_real_distribution<double>
を使えばよい。#include<iostream> #include <random> int main() { std::mt19937_64 mt64(0); //もとにする整数型の乱数は別途必要 std::uniform_real_distribution<double> uni(0, 1); for(int i = 0; i < 30; i++) // 30個出してみる { double rnd = uni(mt64); std::cout << rnd << std::endl; } }
これを実行すると
$ g++ rnd.cpp $ ./a.out 0.159793 0.992145 0.039569 0.597495 0.542285 0.0571598 0.631528 0.423571 0.842261 0.906301 0.423148 0.655526 0.930431 0.344386 0.254615 0.444671 0.790189 0.69542 0.557681 0.28743 0.145816 0.579264 0.56455 0.146418 0.150165 0.0199339 0.554408 0.687332 0.388153 0.928789のように0から1までの値が大体均等に出ていることが確認できる。
そのほかにも
- 正規分布:normal_distribution
- ベルヌーイ分布:bernoulli_distribution
- ポワソン分布:poisson_distribution
よくある間違い
うっかりC言語のようにRAND_MAX
で割ってしなうと、最大値が変わっているため
値域が0--1におさまらない。
#include<iostream> #include <random> int main() { std::mt19937_64 mt64(0); double rnd = mt64() / RAND_MAX; std::cout << rnd << std::endl; }
ちなみにメルセンヌツイスタから出てくる整数の最大値自体は std::mt19937_64::max()で取得できる。