D 1.0   D 2.0
About Japanese Translation

www.digitalmars.com
Last update Thu Aug 7 22:02:17 2008

std.random

乱数生成の機能を実装しています。 旧形式の関数 rand_seedrand は、 グローバル状態を使っていてスレッド安全性など様々な問題を引き起こすため、 すぐに非推奨となる予定です。

新形式の乱数生成器はそれぞれ自身の状態を保持したオブジェクトとなっているため、 スレッドの問題とは無縁です。乱数生成器は、 よく知られた様々な乱数生成方式によって実装されています。 全体的に高速で信頼性の高い乱数生成法は "周期 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 の乱数機能 を元にしています。

struct LinearCongruentialEngine(UIntType,UIntType a,UIntType c,UIntType m);
線形合同法による生成器

alias ResultType;
生成される型 UIntType の alias

bool hasFixedRange;
この生成器の値域は固定か?((true) )

ResultType min;
生成されうる最小の値

ResultType max;
生成されうる最大の値

UIntType multiplier;
この分布のパラメタ。乱数は x = (x * a + c) % m.

UIntType increment;
この分布のパラメタ。乱数は x = (x * a + c) % m.

UIntType modulus;
この分布のパラメタ。乱数は x = (x * a + c) % m.

LinearCongruentialEngine opCall(UIntType x0 = 1);
LinearCongruentialEngine 生成器を構築

void seed(UIntType x0 = 1);
生成器のシードを(再)設定。

UIntType next();
乱数列の次の数値を返します

void discard(ulong n);
次の n 個の乱数値を捨てます。

bool opEquals(LinearCongruentialEngine rhs);
rhs との同値性を比較します。

alias MinstdRand0;
alias MinstdRand;
LinearCongruentialEngine 生成器を "良い" パラメタに設定した生成器

Example:
   // 定数でシードを与える
   auto rnd0 = MinstdRand0(1);
   auto n = rnd0.next; // 実行によらず同じ値
   // 予測不能値にシードを設定
   rnd0.seed(unpredictableSeed);
   n = rnd0.next; // 実行するたびに違う値


struct MersenneTwisterEngine(UIntType,size_t w,size_t n,size_t m,size_t r,UIntType a,size_t u,size_t s,UIntType b,size_t t,UIntType c,size_t l);
Mersenne Twister 生成器

alias ResultType;
出力型 (UIntType の alias)

size_t wordSize;
生成器のパラメタ

size_t stateSize;
生成器のパラメタ

size_t shiftSize;
生成器のパラメタ

size_t maskBits;
生成器のパラメタ

UIntType xorMask;
生成器のパラメタ

UIntType temperingU;
生成器のパラメタ

size_t temperingS;
生成器のパラメタ

UIntType temperingB;
生成器のパラメタ

size_t temperingT;
生成器のパラメタ

UIntType temperingC;
生成器のパラメタ

size_t temperingL;
生成器のパラメタ

UIntType min;
生成されうる最小の値 (0)。

UIntType max;
生成されうる最大の値。

UIntType defaultSeed;
デフォルトのシード

MersenneTwisterEngine opCall(ResultType value);
MersenneTwisterEngine オブジェクトを構築します。

void seed(ResultType value = defaultSeed);
MersenneTwisterEngine オブジェクトを構築します。

uint next();
乱数列の次の数値を返します

void discard(ulong n);
次の n 個の乱数値を捨てます。

alias Mt19937;
MersenneTwisterEngine を、オリジナルの実装 MT19937 と同じパラメタでインスタンス化したもの。 一様分布した32bitの数値を、2の19937乗の周期で生成します。メモリが著しく制限されている場合でない限り (その場合は LinearCongruentialEngine を選択すべきでしょう)、お勧めの乱数生成エンジンです。

Example:
// 定数でシードを与える
Mt19937 gen;
auto n = gen.next; // 実行によらず同じ値
// 予測不能値にシードを設定
gen.seed(unpredictableSeed);
n = gen.next; // 実行するたびに違う値


alias Random;
実行環境における "デフォルトの", "好ましい", "お勧めの" 乱数生成器です。 上で定義された生成器のどれか1つのtypedefとなっています。 (1) なにかしら良い乱数生成器が必要で、しかも (2) 細かい実装方式は特に気にしない、という場合はこの型を使うと良いでしょう。

uint unpredictableSeed();
乱数エンジンを初期化するための "良い" シードです。 unpredictableSeed でエンジンを初期化すると、 実行のたびに違う乱数列を出力するようになります。

Example:
auto rnd = Random(unpredictableSeed);
auto n = rnd.next;
...


struct UniformDistribution(NumberType,string boundaries = "[)"
;
外部の生成器を使って、区間内に一様分布する数値を生成します。 引数 boundaries によって、区間の形式(両側が開区間か閉区間か) を制御します。boundaries に指定可能な値は "[]", "(]", "[)", "()" で、 デフォルトは [a, b) です。

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);


UniformDistribution opCall(NumberType a, NumberType b);
区間 [min, max) (デフォルトの場合) の乱数を生成できる UniformDistribution を構築します。区間の境界はテンプレート引数で制御します。 例えば、UniformDistribution!(double, "[]")(0, 1) は区間 [0.0, 1.0] 内の数値を生成します。
ResultType a();
生成される乱数値の下限を返します。

ResultType b();
生成される乱数値の上限を返します。

void reset();
なにも起きません (他の分布とのインターフェイス統一のために提供されています)

template next(UniformRandomNumberGenerator)
UniformRandomNumberGenerator をバックエンドにして、 生成した乱数を返します。

ResultType next(ref UniformRandomNumberGenerator urng);
UniformRandomNumberGenerator をバックエンドにして、 生成した乱数を返します。

T1 uniform(T1, string boundaries = "[)", UniformRandomNumberGenerator, T2
(ref UniformRandomNumberGenerator gen, T1 a, T2 b);
区間内の値をランダム生成するのに便利な関数。 呼び出しは UniformDistribution!(T, boundaries)(a, b).next に転送されます。

Example:
Random gen(unpredictableSeed);
// [0, 1024) の範囲の整数を生成
auto a = uniform(gen, 0, 1024);
// [0, 1) の範囲の浮動小数点数を生成
auto a = uniform(gen, 0.0f, 1.0f);


void randomShuffle(T, SomeRandomGen)(T[] array, ref SomeRandomGen r);
配列 array を、r をシャッフル用の乱数生成器として使ってランダムに並び替えます。

size_t dice(R)(ref R rnd, double[] proportions...);
proportions. Returns the index in proportions で指定された相対的な確率によって出目が選ばれるサイコロを振ります。

Example:
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 は 70% の確率で 0、30% で 1、
                           // 10% で 2


void rand_seed(uint seed, uint index);
乱数生成ルーチンは、プログラムのスタート時にランダムな値で seedが与えられます。これにより、確実に、プログラムの起動毎に 違う乱数列が生成されます。再現性のある乱数列を生成するには、 rand_seed() を呼んで乱数列の計算を始めて下さい。 seed と開始 index から始めて、一回乱数を得るごとに index が1増えていきます。 これは、n 番目の乱数値は rand_seed() へ直接 index + n を渡せば得られることを意味します。

Note:
この関数は、Cのrand()よりもランダム性が高く、かわりに遅い関数です。 C の rand() を使うには、std.c.stdlib を import します。

BUGS:
単一のグローバル状態を共有しており、マルチスレッド非対応です。 非推奨関数となる予定です

uint rand();
乱数列中の次の乱数を得ます。

BUGS:
単一のグローバル状態を共有しており、マルチスレッド非対応です。 非推奨関数となる予定です