12 constexpr unsigned MATRIX_A = 0x9908b0dfu;
13 constexpr unsigned UPPER_MASK = 0x80000000u;
14 constexpr unsigned LOWER_MASK = 0x7fffffffu;
15 constexpr unsigned TEMPERING_MASK_B = 0x9d2c5680u;
16 constexpr unsigned TEMPERING_MASK_C = 0xefc60000u;
19 inline unsigned TEMPER_U(
unsigned y) {
return y >> 11; }
20 inline unsigned TEMPER_S(
unsigned y) {
return y << 7; }
21 inline unsigned TEMPER_T(
unsigned y) {
return y << 15; }
22 inline unsigned TEMPER_L(
unsigned y) {
return y >> 18; }
25 static unsigned mt[N][2];
26 static int mti[2] = { N + 1, N + 1 };
29 static unsigned mag01[2] = { 0u, MATRIX_A };
38 seed =
static_cast<unsigned int>(std::clock());
41 for (mti[seq] = 1; mti[seq] < N; ++mti[seq]) {
42 mt[mti[seq]][seq] = (69069u * mt[mti[seq] - 1][seq]) & 0xffffffffu;
46 unsigned int rand(
int seq )
53 if (mti[seq] == N + 1) {
58 for (
int kk = 0; kk < N - M; ++kk) {
59 y = (mt[kk][seq] & UPPER_MASK) | (mt[kk + 1][seq] & LOWER_MASK);
60 mt[kk][seq] = mt[kk + M][seq] ^ (y >> 1) ^ mag01[y & 0x1];
62 for (
int kk = N - M; kk < N - 1; ++kk) {
63 y = (mt[kk][seq] & UPPER_MASK) | (mt[kk + 1][seq] & LOWER_MASK);
64 mt[kk][seq] = mt[kk + (M - N)][seq] ^ (y >> 1) ^ mag01[y & 0x1];
66 y = (mt[N - 1][seq] & UPPER_MASK) | (mt[0][seq] & LOWER_MASK);
67 mt[N - 1][seq] = mt[M - 1][seq] ^ (y >> 1) ^ mag01[y & 0x1];
72 y = mt[mti[seq]++][seq];
74 y ^= TEMPER_S(y) & TEMPERING_MASK_B;
75 y ^= TEMPER_T(y) & TEMPERING_MASK_C;
@ seed
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
Interface para geração de números aleatórios independentes do sistema operativo.
Agrupa funções para inicializar e obter valores pseudo-aleatórios.
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
void srand(unsigned int seed, int seq)
Inicializa a semente da geração pseudo-aleatória.