boost::random

トップページ > 数学 >

abstract

必要なヘッダ
<boost/random.hpp>
出来ること
疑似乱数生成
リファレンス
en / jp

sample

#include <ctime>
#include <iostream>
#include <boost/random.hpp>
using namespace std;

int main()
{
	using namespace boost;
	cout.setf( ios::fixed );

	{
		// 「線形合同法」( Seed=42 ) で
		// 「一様乱数」(0.0以上1.0未満) を生成
		minstd_rand    gen( 42 );
		uniform_real<> dst( 0, 1 );
		variate_generator<
			minstd_rand&, uniform_real<>
		> rand( gen, dst );

		// 値を取り出すときは () で。
		for( int i=0; i<10; ++i )
			cout << rand() << endl;
		cout << endl;
	}
	{
		// 「メルセンヌツイスター」( Seed=現在時刻 ) で
		// 「小さな整数の一様乱数」( 1~6 ) を生成
		mt19937            gen( static_cast<unsigned long>(time(0)) );
		uniform_smallint<> dst( 1, 6 );
		variate_generator<
			mt19937&, uniform_smallint<>
		> rand( gen, dst );

		for( int i=0; i<10; ++i )
			cout << rand() << endl;
		cout << endl;
	}

	{
		// 「遅延フィボナッチ法」( Seed=おまかせ )
		// 「正規分布」( 平均μ=100, 標準偏差σ=20 )
		lagged_fibonacci1279 gen;
		normal_distribution<> dst( 100.0, 20.0 );
		variate_generator<
			lagged_fibonacci1279&, normal_distribution<>
		> rand( gen, dst );

		for( int i=0; i<10; ++i )
			cout << rand() << endl;
		cout << endl;
	}

	{
		// 「この論文の方法」( Seed=100 )
		// 「ベルヌーイ分布」( 確率変数 p=0.6 )
		hellekalek1995 gen( 100 );
		bernoulli_distribution<> dst( 0.6 );
		variate_generator<
			hellekalek1995&, bernoulli_distribution<>
		> rand( gen, dst );

		for( int i=0; i<10; ++i )
			cout << rand() << endl;
		cout << endl;
	}
	return 0;
}

出力例

0.000944
0.571363
0.256809
0.447674
0.654139
0.966970
0.628985
0.716352
0.042059
0.227523

4
1
2
5
6
2
4
1
1
1

106.121794
59.329111
85.569261
100.352195
117.378101
92.160037
87.949767
75.004497
91.061817
87.173537

1
1
1
1
1
0
0
1
1
1

etc

C標準ライブラリの rand, srand は、 適当に簡単なゲームなどを作る分には十分すぎるくらい十分なのですが、 「seedをグローバルに持っているので扱いにくい」 「乱数生成アルゴリズムがあまりよろしくないかも」 「決まった範囲の整数値を生成するのみなので加工してから使わないといけない」 など幾つか問題点があって、本格的に使うにはいささか力不足です。 そこで、boost::random

生成アルゴリズム色々分布色々 を組み合わせて使います。 対応する環境であれば、ソフト的に疑似乱数を計算するのではなく random_device を通して、 真に確率的な乱数を利用することもできるそうな。

see also

presented by k.inaba (kiki .a.t. kmonos.net) under CC0