std.random
乱数生成の機能を実装しています。 旧形式の関数 rand_seed と rand は、 グローバル状態を使っていてスレッド安全性など様々な問題を引き起こすため、 すぐに非推奨となる予定です。 新形式の乱数生成器はそれぞれ自身の状態を保持したオブジェクトとなっているため、 スレッドの問題とは無縁です。乱数生成器は、 よく知られた様々な乱数生成方式によって実装されています。 全体的に高速で信頼性の高い乱数生成法は "周期 2^19937 の Mersenne Twister " から 名前をとった Mt19937 です。 メモリの制約のきつい状況では、 線形合同法 による生成器 MinstdRand0 や MinstdRand が有用でしょう。 標準ライブラリでは、alias Random を、 ターゲット環境にもっとも合っていると思われる生成器の別名として提供しています。 Example:// 範囲 [0, 14] に一様に分布する整数を生成 auto i = uniform(0, 15); // 範囲 [0, 100) に一様に分布する実数を // 指定の乱数ジェネレータを使って生成 Random gen; auto r = uniform(0.0L, 100.0L, gen);乱数生成器に加え、このモジュールでは、 生成器の出力をさまざまな統計分布にしたがって変換する "分布(distribution)" オブジェクトを提供します。現在のところ、 整数と実数の一様分布が実装されています。 Source:
std/random.d License:
Boost License 1.0. Authors:
Andrei Alexandrescu Credits:
乱数ライブラリ全体の構成は、 Jens Maurer の提案であり Fermi laborartory の研究者の貢献からなる、素晴らしい C++0X の乱数機能 を元にしています。
- 線形合同法による生成器
- この生成器の値域は固定か? (固定ならば true)
- 生成されうる最小の値 (c == 0 ならば 1 で、それ以外ならば 0)
- 生成されうる最大の値 (modulus - 1).
- この分布のパラメタ。乱数は x = (x * multipler + increment) % modulus
- this(UIntType x0);
- LinearCongruentialEngine 生成器を シード x0 で構築
- 生成器のシードを(再)設定。
- 乱数列を一つ進めます。
- 現在の乱数値を返します。
- 常に false (乱数生成器は無限レンジです)
- rhs との等しさを判定します。
- LinearCongruentialEngine を"良い"パラメタに設定した生成器です。
MinstdRand0 は Park と Miller の "minimal
standard" generator を使用しており、multiplier として 16807 を採用します。MinstdRand
は、multiplier として 48271 を採用することでわずかにベターなスペクトル検定結果を実現した変種です。
どちらも非常に簡単すぎる乱数生成器です。
Example:
// 定数でシードを与える auto rnd0 = MinstdRand0(1); auto n = rnd0.front; // 実行によらず同じ値 // 予測不能値にシードを設定 rnd0.seed(unpredictableSeed); n = rnd0.front; // 実行するたびに違う値
- Mersenne
Twister 生成器
- 生成器のパラメタ
- 生成されうる最小の値 (0)。
- 生成されうる最大の値。
- デフォルトのシード
- this(UIntType value);
- MersenneTwisterEngine オブジェクトを構築します。
- MersenneTwisterEngine オブジェクトにシードを設定します。
- 乱数列を一つ進めます。
- 現在の乱数値を返します。
- 常に false.
- MersenneTwisterEngine を、オリジナルの実装
MT19937 と同じパラメタでインスタンス化したもの。
一様分布した32bitの数値を、2の19937乗の周期で生成します。メモリが著しく制限されている場合でない限り
(その場合は LinearCongruentialEngine を選択すべきでしょう)、お勧めの乱数生成エンジンです。
Example:
// 定数でシードを与える Mt19937 gen; auto n = gen.front; // 実行によらず同じ値 // 予測不能値にシードを設定 gen.seed(unpredictableSeed); n = gen.front; // 実行するたびに違う値
- 乱数エンジンを初期化するための "良い" シードです。
unpredictableSeed でエンジンを初期化すると、
実行のたびに違う乱数列を出力するようになります。
Example:
auto rnd = Random(unpredictableSeed); auto n = rnd.front; ...
- 実行環境における "デフォルトの", "好ましい", "お勧めの" 乱数生成器です。 上で定義された生成器のどれか1つのtypedefとなっています。 (1) なにかしら良い乱数生成器が必要で、しかも (2) 細かい実装方式は特に気にしない、という場合はこの型を使うと良いでしょう。
- このモジュールの様々な関数で乱数ジェネレータを指定しなかった場合に使われる、 デフォルトのグローバル乱数ジェネレータです。スレッド毎に別々に割り当てられ、 各スレッドで別々の予測不能値で初期化されます。
- (T1 a, T2 b, ref UniformRandomNumberGenerator urng);
Random gen(unpredictableSeed); // 区間 [0, 1023] 内の整数を生成 auto a = uniform(0, 1024, gen); // 区間 [0, 1) 内のfloatを生成 auto a = uniform(0.0f, 1.0f, gen);
auto x = dice(0.5, 0.5); // x は等確率で 0 か 1 auto y = dice(50, 50); // y は等確率で 0 か 1 auto z = dice(70, 20, 10); // z は 7 割の確率で 0、2割の確率で 1、 // 1割の確率で 2
int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]; auto rnd = Random(unpredictableSeed); foreach (e; randomCover(a, rnd)) { writeln(e); }
int[] a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]; // rか5つランダムに取り出し foreach (e; randomSample(n, 5)) { writeln(e); }
- this(R input, size_t howMany);
this(R input, size_t howMany, size_t total); - コンストラクタ
- レンジの基本関数
- 返したエントリのインデックスを返します
この関数は、Cのrand()よりもランダム性が高く、かわりに遅い関数です。 C の rand() を使うには、std.c.stdlib を import します。 BUGS:
単一のグローバル状態を共有しており、マルチスレッド非対応です。廃止予定です
単一のグローバル状態を共有しており、マルチスレッド非対応です。廃止予定です