3.4.2. pfi::math::random

3.4.2.1. 概要

乱数を生成するためのライブラリ。

3.4.2.2. 使い方

class random<Gen>

ランダムクラス。Genに乱数生成器を指定する。

random::random()

デフォルトコンストラクタ。 時刻をseedに乱数生成器を初期化。

random::random(uint32_t seed)

seedを指定して初期化。

uint32_t random::next_int()

[0,0xffffffff]の範囲の整数を生成。

uint32_t random::next_int(uint32_t a)

[0,a)の範囲の整数を生成。

uint32_t random::next_int(uint32_t a, uint b)

[a,b)の範囲の整数を生成。

double next_double()

[0,1)の範囲の浮動小数を生成。 53ビットの解像度がある。

double next_gaussian()

平均0、分散1の正規分布で浮動小数を生成。

double next_gaussian(double mean, double deviation)

平均と分散を指定して生成。

uint32_t operator()()
uint32_t operator(uint32_t a)()
uint32_t operator(uint32_t a, uint32_t b)()

next_int()のそれぞれに対応。 random_shuffle()などに使いやすいように。

3.4.2.2.1. ジェネレータ

gen::gen(uint32_t seed)
uint32_t gen::next()

uint32_tのseedを引数にとり、 uint32_tで範囲[0,0xffffffff]の乱数を返すクラス。

メルセンヌツイスタ実装が pfi::math::random::mersenne_twisterに用意されている。 さらに

typedef random<mersenne_twister> mtrand;

が定義されているので、手軽に使える。

3.4.2.3. サンプルコード

int main()
{
  mtrand r(777);

  cout<<r.next_int()<<endl;
  cout<<r.next_double()<<endl;

  int tbl[10]={0,1,2,3,4,5,6,7,8,9};
  random_shuffle(tbl, tbl+10, r); // こういうのに渡せる

  return 0;
}