Classe mersenne_twister
Gera uma sequência aleatória pelo algoritmo Mersenne twister.
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()();
};
Parâmetros
UIntType
O tipo de resultado inteiro sem sinal.W
O parâmetro de mecanismo W.N
O parâmetro N mecanismo.R
O parâmetro de mecanismo R.A
O parâmetro de mecanismo A.U
O parâmetro U mecanismo.S
O parâmetro S mecanismo.B
O parâmetro de mecanismo B.T
O parâmetro de mecanismo T.C
O parâmetro C mecanismo.L
O parâmetro de mecanismo L.
Comentários
Modelo de classe decribes um mecanismo simples.Ele mantém um grande valor integral com W * (N - 1) + R bits. Ele extrai W bits em um horário desse valor grande e ele usou todos os bits ele torce valor grande, deslocando e mistura os bits para que ele tenha um novo conjunto de bits para extrair. The engine's state is the last NW-bit values used if operator() has been called at least N times, otherwise the MW-bit values that have been used and the last N - M values of the seed.
O argumento de modelo UIntType deve ser grande o suficiente para armazenar valores até 2W - 1. Os valores dos outros argumentos do modelo devem atender aos seguintes requisitos:
0 < M <= N
0 <= R, U, S, T, L <= W
0 <= A, B, C <= 2W
W * (N - 1) + R deve ser um "Prime" Mersenne
O gerador de torce valor grande que mantém executando o código a seguir:
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];
em que LMASK um não está assinado W-valor com sua baixa de bit R bit definidos como 1 e o restante do seus bit definidos como 0, e HMASK é o complemento do LMASK.
O gerador mantém um índice corrente idx inicializadas como 0. Ele extrai bits executando o código a seguir:
temp = x[idx++];
temp = temp ^ (temp >> U);
temp = temp ^ ((temp << S) & B);
temp = temp ^ ((temp << T) & C);
temp = temp ^ (temp >> L);
Quando idx atingir N o gerador de torce o valor armazenado e define idx volta para 0.
Requisitos
Cabeçalho:<random>
Namespace: std::tr1