mersenne_twister_engine クラス
メルセンヌ ツイスタ アルゴリズムでランダム シーケンスを生成します。
template<class UIntType,
size_t W, size_t N, size_t M, size_t R,
UIntType A, size_t U,
UIntType D, size_t S,
UIntType B, size_t T,
UIntType C, size_t L
UIntType F>
class mersenne_twister_engine {
public:
typedef UIntType result_type;
static const size_t word_size = W;
static const size_t state_size = N;
static const size_t shift_size = M;
static const size_t mask_bits = R;
static const UIntType xor_mask = A;
static const size_t tempering_u = U;
static const size_t tempering_d = D;
static const size_t tempering_s = S;
static const UIntType tempering_b = B;
static const size_t tempering_t = T;
static const UIntType tempering_c = C;
static const size_t tempering_l = L;
static const UIntType initialization_multiplier = C;
static const result_type default_seed = 5489U;
explicit mersenne_twister_engine(unsigned long x0 = default_seed);
explicit mersenne_twister_engine(seed_seq& seq);
void seed(unsigned long x0 = default_seed);
template<class Gen>
void seed(seed_seq& seq);
result_type min() const;
result_type max() const;
result_type operator()();
void discard(unsigned long long count)();
};
パラメーター
UIntType
結果を表す符号なし整数型。W
W エンジン パラメーター。N
N エンジン パラメーター。M
M エンジン パラメーター。R
R エンジン パラメーター。A
A エンジン パラメーター。U
U エンジン パラメーター。D
D エンジン パラメーター。S
S エンジン パラメーター。B
B エンジン パラメーター。T
T エンジン パラメーター。C
C エンジン パラメーター。L
L エンジン パラメーター。F
F エンジン パラメーター。
解説
このテンプレート クラスは、<random>を表します。このエンジンは、W * (N - 1) + R ビットの大きな整数値を保持します。この大きな値から一度に W ビットを抽出し、すべてのビットを使用し尽くすと、ビットをシフトし、混ぜ合わせることにより大きな値に "ひねり" を加えて、抽出元となる新しいビットの集合を作成します。エンジンの状態は、operator() が少なくとも N 回呼び出された場合は、最後に使用された NW ビットの値になります。それ以外の場合は、使用された MW ビットの値およびシードの最後の N - M の値になります。
テンプレート引数 UIntType には、最大 2W - 1 の値を保持するのに十分な大きさが必要です。その他のテンプレート引数の値は、次の要件を満たしている必要があります。
1 < M <= N
0 <= R, U, S, T, L <= W
0 <= A, B, C <= 2W - 1
W * (N - 1) + R がメルセンヌ素数であること。
ジェネレーターが、次のコードを実行することによって、保持している大きな値にひねりを加えること。
for (size_t i = 0; i < N; ++i)
{ // twist
temp = (x[i] & LMASK) << (W - 1) | (x[i + 1] & HMASK) >> 1;
if (temp & 1)
y[i] = (temp >> 1) ^ A ^ x[(i + R) % N];
else
y[i] = (temp >> 1) ^ x[(i + R) % N];
}
for (size_t i = 0; i < N; ++i)
x[i] = y[i];
LMASK は、下位 R ビットが 1 に設定され、それ以外のビットが 0 に設定された、符号なし W ビットの値を表します。HMASK は、LMASK の補数を表します。
このジェネレーターは、0 に初期化された現在のインデックス idx を保持しています。次のコードを実行することによってビットを抽出します。
temp = x[idx++];
temp = temp ^ ((temp >> U) & D);
temp = temp ^ ((temp << S) & B);
temp = temp ^ ((temp << T) & C);
temp = temp ^ (temp >> L);
idx が N に達すると、ジェネレーターは、格納されている値にひねりを加え、idx を 0 に戻します。
必要条件
ヘッダー : <random>
名前空間: std
参照
関連項目
mersenne_twister_engine::discard
mersenne_twister_engine::mersenne_twister_engine