由Mersenne扭转项算法生成一个随机顺序。保留为TR1兼容性。请改用 mersenne_twister_engine Class。
template<class UIntType,
int W, int N, int M, int R,
UIntType A, int U, int S,
UIntType B, int T, UIntType C, int L>
class mersenne_twister {
public:
typedef mersenne_twister<UIntType, W, N, M, R,
P, U, S, B, T, C, L> _MyT;
typedef UIntType result_type;
static const int word_size = W;
static const int state_size = N;
static const int shift_size = M;
static const int mask_bits = R;
static const int UIntType parameter_a = A;
static const int output_u = U;
static const int output_s = S;
static const UIntType output_b = B;
static const int output_t = T;
static const UIntType output_c = C;
static const int output_l = L;
static const UIntType default_seed = 5489U;
explicit mersenne_twister(unsigned long x0 = default_seed);
mersenne_twister(const mersenne_twister& right);
mersenne_twister(mersenne_twister& right);
template<class Gen>
mersenne_twister(Gen& gen);
void seed(unsigned long x0 = default_seed);
template<class Gen>
void seed(Gen& gen);
result_type min() const;
result_type max() const;
result_type operator()();
};
参数
UIntType
无符号整数结果类型。W
W引擎参数。N
N引擎参数。R
R引擎参数。A
A引擎参数。U
U引擎参数。S
引擎的参数。B
B引擎参数。T
T引擎参数。C
C引擎参数。L
L引擎参数。
备注
模板选件类描述一个简单的引擎。它表示与 W * (N - 1) + R 位的一个大整数值。它从此最大值一次提取 W 位,因此,在使用了所有位时它通过转换和组合位扭转最大值,以使其具有一组新的提取自。引擎处理状态是最后 NW-位值使用的,如果 operator() 调用至少 N 时,否则 MW-使用的位值。个种子的最后一 N - M 值。
模板参数 UIntType 必须足够大表示值到 2W - 1。其他模板参数的值必须满足以下要求:
0 < M <= N
0 <= R, U, S, T, L <= W
0 <= A, B, C <= 2W
W * (N - 1) + R 必须是Mersenne最初
生成器扭转它通过执行以下代码表示的最大值:
for (int i = 0; i < N; ++i)
{
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 (int 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);
temp = temp ^ ((temp << S) & B);
temp = temp ^ ((temp << T) & C);
temp = temp ^ (temp >> L);
当 idx 到达 N 时生成器扭转该存储的值并将 idx 为0。
要求
标头: <random>
命名空间: std