TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
TRand.cpp
Go to the documentation of this file.
1// TRand.cpp: implementação do namespace TRand para geração de números aleatórios.
2//
3#include <ctime>
4#include "TRand.h"
5
6namespace {
7 // parâmetros do período
8 constexpr int N = 624;
9 constexpr int M = 397;
10
11 // constantes para tempering
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;
17
18 // shifts de tempering
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; }
23
24 // estado interno: duas sequências independentes
25 static unsigned mt[N][2];
26 static int mti[2] = { N + 1, N + 1 };
27
28 // auxiliar para mag01[x] = x * MATRIX_A
29 static unsigned mag01[2] = { 0u, MATRIX_A };
30}
31
32namespace TRand {
33
34 void srand(unsigned int seed, int seq /*=0*/)
35 {
36 seq &= 1;
37 if (seed == 0)
38 seed = static_cast<unsigned int>(std::clock());
39
40 mt[0][seq] = seed;
41 for (mti[seq] = 1; mti[seq] < N; ++mti[seq]) {
42 mt[mti[seq]][seq] = (69069u * mt[mti[seq] - 1][seq]) & 0xffffffffu;
43 }
44 }
45
46 unsigned int rand(int seq /*=0*/)
47 {
48 unsigned int y;
49 seq &= 1;
50
51 if (mti[seq] >= N) {
52 // gera N palavras de uma vez
53 if (mti[seq] == N + 1) {
54 // seed padrão
55 srand(0, seq);
56 }
57
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];
61 }
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];
65 }
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];
68
69 mti[seq] = 0;
70 }
71
72 y = mt[mti[seq]++][seq];
73 y ^= TEMPER_U(y);
74 y ^= TEMPER_S(y) & TEMPERING_MASK_B;
75 y ^= TEMPER_T(y) & TEMPERING_MASK_C;
76 y ^= TEMPER_L(y);
77
78 return y;
79 }
80
81} // namespace TRand
82
@ seed
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
Definition TProcura.h:44
Interface para geração de números aleatórios independentes do sistema operativo.
Agrupa funções para inicializar e obter valores pseudo-aleatórios.
Definition TRand.cpp:32
unsigned int rand(int seq)
Retorna o próximo valor pseudo-aleatório.
Definition TRand.cpp:46
void srand(unsigned int seed, int seq)
Inicializa a semente da geração pseudo-aleatória.
Definition TRand.cpp:34