std.random
乱数生成の機能を実装しています。 旧形式の関数 rand_seed と rand は、 グローバル状態を使っていてスレッド安全性など様々な問題を引き起こすため、 すぐに非推奨となる予定です。新形式の乱数生成器はそれぞれ自身の状態を保持したオブジェクトとなっているため、 スレッドの問題とは無縁です。乱数生成器は、 よく知られた様々な乱数生成方式によって実装されています。 全体的に高速で信頼性の高い乱数生成法は "周期 2^19937 の Mersenne Twister " から 名前をとった Mt19937 です。 メモリの制約のきつい状況では、 線形合同法 による生成器 MinstdRand0 や MinstdRand が有用でしょう。 標準ライブラリでは、alias Random を、 ターゲット環境にもっとも合っていると思われる生成器の別名として提供しています。
Example:
Random gen; // 範囲 [0, 15] に一様に分布する整数を生成 auto i = uniform!(int)(gen, 0, 15); // 範囲 [0, 100) に一様に分布する実数を生成 auto r = uniform!(real)(gen, 0.0L, 100.0L);乱数生成器に加え、このモジュールでは、 生成器の出力をさまざまな統計分布にしたがって変換する "分布(distribution)" オブジェクトを提供します。現在のところ、 整数と実数の一様分布が実装されています。
Author:
Andrei Alexandrescu
Credits:
乱数ライブラリ全体の構成は、 Jens Maurer の提案であり Fermi laborartory の研究者の貢献からなる、素晴らしい C++0X の乱数機能 を元にしています。
- 線形合同法による生成器
- 生成される型 UIntType の alias
- この生成器の値域は固定か?((true)
)
- 生成されうる最小の値
- 生成されうる最大の値
- この分布のパラメタ。乱数は x =
(x * a + c) % m.
- この分布のパラメタ。乱数は x =
(x * a + c) % m.
- この分布のパラメタ。乱数は x =
(x * a + c) % m.
- LinearCongruentialEngine 生成器を構築
- 生成器のシードを(再)設定。
- 乱数列の次の数値を返します
- 次の n 個の乱数値を捨てます。
- rhs との同値性を比較します。
Example:
// 定数でシードを与える auto rnd0 = MinstdRand0(1); auto n = rnd0.next; // 実行によらず同じ値 // 予測不能値にシードを設定 rnd0.seed(unpredictableSeed); n = rnd0.next; // 実行するたびに違う値
- 出力型 (UIntType の alias)
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成器のパラメタ
- 生成されうる最小の値 (0)。
- 生成されうる最大の値。
- デフォルトのシード
- MersenneTwisterEngine オブジェクトを構築します。
- MersenneTwisterEngine オブジェクトを構築します。
- 乱数列の次の数値を返します
- 次の n 個の乱数値を捨てます。
Example:
// 定数でシードを与える Mt19937 gen; auto n = gen.next; // 実行によらず同じ値 // 予測不能値にシードを設定 gen.seed(unpredictableSeed); n = gen.next; // 実行するたびに違う値
Example:
auto rnd = Random(unpredictableSeed); auto n = rnd.next; ...
Example:
auto a = new double[20]; Random gen; auto rndIndex = UniformDistribution!(uint)(0, a.length); auto rndValue = UniformDistribution!(double)(0, 1); // 配列のランダムなインデックス auto i = rndIndex.next(gen); // ランダムな確率、つまり [0, 1) の範囲の実数 auto p = rndValue.next(gen); // その値を配列要素に代入 a[i] = p; auto digits = UniformDistribution!(char, "[]")('0', '9'); auto percentages = UniformDistribution!(double, "(]")(0.0, 100.0); // ['0', '9'] の範囲の数字 auto digit = digits.next(gen); // (0.0, 100.0] の範囲の数 auto p = percentages.next(gen);
- 区間 [min, max) (デフォルトの場合) の乱数を生成できる UniformDistribution を構築します。区間の境界はテンプレート引数で制御します。 例えば、UniformDistribution!(double, "[]")(0, 1) は区間 [0.0, 1.0] 内の数値を生成します。
- 生成される乱数値の下限を返します。
- 生成される乱数値の上限を返します。
- なにも起きません (他の分布とのインターフェイス統一のために提供されています)
- UniformRandomNumberGenerator をバックエンドにして、
生成した乱数を返します。
- UniformRandomNumberGenerator をバックエンドにして、
生成した乱数を返します。
