TProcuraAdversa
Algoritmos de procura adversa
Loading...
Searching...
No Matches
TRand.cpp
Go to the documentation of this file.
1// TRand.cpp: implementation of the TRand class.
2//
4
5#include <time.h>
6#include "TRand.h"
7
8
9/* Period parameters */
10//#define N 624
11//#define M 397
12#define N 27
13#define M 7
14#define MATRIX_A 0x9908b0df /* constant vector a */
15#define UPPER_MASK 0x80000000 /* most significant w-r bits */
16#define LOWER_MASK 0x7fffffff /* least significant r bits */
17
18/* Tempering parameters */
19#define TEMPERING_MASK_B 0x9d2c5680
20#define TEMPERING_MASK_C 0xefc60000
21#define TEMPERING_SHIFT_U(y) (y >> 11)
22#define TEMPERING_SHIFT_S(y) (y << 7)
23#define TEMPERING_SHIFT_T(y) (y << 15)
24#define TEMPERING_SHIFT_L(y) (y >> 18)
25
26static unsigned int mt[N][2]; /* the array for the state vector */
27static int mti[2] = { N + 1, N + 1 }; /* mti==N+1 means mt[N] is not initialized */
28
29
31// Construction/Destruction
33
35{
36
37}
38
40{
41
42}
43
44void TRand::srand(unsigned int seed, int seq)
45{
46 /* setting initial seeds to mt[N] using */
47 /* the generator Line 25 of Table 1 in */
48 /* [KNUTH 1981, The Art of Computer Programming */
49 /* Vol. 2 (2nd Ed.), pp102] */
50
51 seq &= 1;
52
53 if (seed == 0)
54 seed = (unsigned int)clock();
55
56 mt[0][seq] = seed & 0xffffffff;
57 for (mti[seq] = 1; mti[seq] < N; mti[seq]++)
58 mt[mti[seq]][seq] = (69069 * mt[mti[seq] - 1][seq]) & 0xffffffff;
59}
60
61unsigned int TRand::rand(int seq)
62{
63 unsigned int y;
64 static unsigned int mag01[2]={0x0, MATRIX_A};
65 /* mag01[x] = x * MATRIX_A for x=0,1 */
66 seq &= 1;
67
68 if (mti[seq] >= N) { /* generate N words at one time */
69 int kk;
70
71 if (mti[seq] == N+1) /* if sgenrand() has not been called, */
72 srand(0, seq); /* a default initial seed is used */
73
74 for (kk = 0; kk < N - M; kk++) {
75 y = (mt[kk][seq] & UPPER_MASK) | (mt[kk + 1][seq] & LOWER_MASK);
76 mt[kk][seq] = mt[kk + M][seq] ^ (y >> 1) ^ mag01[y & 0x1];
77 }
78 for (; kk < N - 1; kk++) {
79 y = (mt[kk][seq] & UPPER_MASK) | (mt[kk + 1][seq] & LOWER_MASK);
80 mt[kk][seq] = mt[kk + (M - N)][seq] ^ (y >> 1) ^ mag01[y & 0x1];
81 }
82 y = (mt[N - 1][seq] & UPPER_MASK) | (mt[0][seq] & LOWER_MASK);
83 mt[N-1][seq] = mt[M-1][seq] ^ (y >> 1) ^ mag01[y & 0x1];
84
85 mti[seq] = 0;
86 }
87
88 y = mt[mti[seq]++][seq];
89 y ^= TEMPERING_SHIFT_U(y);
92 y ^= TEMPERING_SHIFT_L(y);
93
94 return y;
95}
96
97#undef N
98#undef M
99#undef MATRIX_A
100#undef UPPER_MASK
101#undef LOWER_MASK
102#undef TEMPERING_MASK_B
103#undef TEMPERING_MASK_C
104#undef TEMPERING_SHIFT_U
105#undef TEMPERING_SHIFT_S
106#undef TEMPERING_SHIFT_T
107#undef TEMPERING_SHIFT_L
@ seed
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
#define N
Definition TRand.cpp:12
#define TEMPERING_SHIFT_T(y)
Definition TRand.cpp:23
#define TEMPERING_SHIFT_L(y)
Definition TRand.cpp:24
#define TEMPERING_SHIFT_U(y)
Definition TRand.cpp:21
#define MATRIX_A
Definition TRand.cpp:14
#define UPPER_MASK
Definition TRand.cpp:15
#define LOWER_MASK
Definition TRand.cpp:16
#define M
Definition TRand.cpp:13
#define TEMPERING_MASK_B
Definition TRand.cpp:19
#define TEMPERING_SHIFT_S(y)
Definition TRand.cpp:22
#define TEMPERING_MASK_C
Definition TRand.cpp:20
TRand()
Definition TRand.cpp:34
static unsigned int rand(int seq=0)
Definition TRand.cpp:61
virtual ~TRand()
Definition TRand.cpp:39
static void srand(unsigned int seed, int seq=0)
Definition TRand.cpp:44