mersenne_twister_engine Class
由 Mersenne 反轉搜尋演算法產生隨機序列。
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 來源位元這麼大的值,如此一來,當,它使用了所有位元會藉由將和混合位元反轉較大的值,使其具有捕捉動作的一組新的來源位元。 引擎的狀態是最後一個 NW-位元值,用於 operator() 呼叫至少 N 時間,則為 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 必須是 Mersenne 初始
產生器反轉它會藉由執行下列程式碼顯示較大的值:
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 是不帶正負號的 W-使用其 R 低位元設定為 1 和其餘的位元值其位元設定為 0 和 HMASK 是 LMASK的補充方法。
產生器儲存目前索引 idx 初始化為 0。 它會藉由執行下列程式碼會擷取位元組:
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