52
52
53
53
#include " specrand.h"
54
54
55
- /* Period parameters */
56
- #define N 624
57
- #define M 397
58
- #define MATRIX_A 0x9908b0dfUL /* constant vector a */
59
- #define UPPER_MASK 0x80000000UL /* most significant w-r bits */
60
- #define LOWER_MASK 0x7fffffffUL /* least significant r bits */
61
-
62
- static unsigned long mt[N]; /* the array for the state vector */
63
- static int mti = N + 1 ; /* mti==N+1 means mt[N] is not initialized */
64
-
65
- void spec_srand (int seed) {
66
- spec_init_genrand ((unsigned long )seed);
55
+ double SpecRandomNumberGenerator::spec_rand_ () {
56
+ return spec_genrand_int32_ () * (1.0 / 4294967296.0 );
67
57
}
68
58
69
- /* Just a copy of spec_genrand_real2() */
70
- double spec_rand () {
71
- return spec_genrand_int32 () * (1.0 / 4294967296.0 );
59
+ long SpecRandomNumberGenerator::spec_lrand48_ () {
60
+ return (long )(spec_genrand_int32_ () >> 1 );
72
61
}
73
62
74
- /* Just a copy of spec_genrand_int31() */
75
- long spec_lrand48 () {
76
- return (long )(spec_genrand_int32 () >> 1 );
77
- }
78
-
79
- /* initializes mt[N] with a seed */
80
- void spec_init_genrand (unsigned long s) {
63
+ void SpecRandomNumberGenerator::spec_init_genrand_ (unsigned long s) {
81
64
mt[0 ] = s & 0xffffffffUL ;
82
65
for (mti = 1 ; mti < N; mti++) {
83
66
mt[mti] = (1812433253UL * (mt[mti - 1 ] ^ (mt[mti - 1 ] >> 30 )) + mti);
@@ -90,16 +73,11 @@ void spec_init_genrand(unsigned long s) {
90
73
}
91
74
}
92
75
93
- /* initialize by an array with array-length */
94
- /* init_key is the array for initializing keys */
95
- /* key_length is its length */
96
- /* slight change for C++, 2004/2/26 */
97
- void spec_init_by_array (unsigned long init_key[], int key_length) {
98
- int i, j, k;
99
- spec_init_genrand (19650218UL );
100
- i = 1 ;
101
- j = 0 ;
102
- k = (N > key_length ? N : key_length);
76
+ void SpecRandomNumberGenerator::spec_init_by_array_ (const unsigned long init_key[], size_t key_length) {
77
+ spec_init_genrand_ (19650218UL );
78
+ size_t i = 1 ;
79
+ size_t j = 0 ;
80
+ size_t k = (N > key_length ? N : key_length);
103
81
for (; k; k--) {
104
82
mt[i] = (mt[i] ^ ((mt[i - 1 ] ^ (mt[i - 1 ] >> 30 )) * 1664525UL ))
105
83
+ init_key[j] + j; /* non linear */
@@ -127,22 +105,21 @@ void spec_init_by_array(unsigned long init_key[], int key_length) {
127
105
}
128
106
129
107
/* generates a random number on [0,0xffffffff]-interval */
130
- unsigned long spec_genrand_int32 () {
108
+ unsigned long SpecRandomNumberGenerator::spec_genrand_int32_ () {
131
109
unsigned long y;
132
110
static unsigned long mag01[2 ] = {0x0UL , MATRIX_A};
133
111
/* mag01[x] = x * MATRIX_A for x=0,1 */
134
112
135
113
if (mti >= N) { /* generate N words at one time */
136
- int kk;
137
114
138
115
if (mti == N + 1 ) /* if init_genrand() has not been called, */
139
- spec_init_genrand (5489UL ); /* a default initial seed is used */
116
+ spec_init_genrand_ (5489UL ); /* a default initial seed is used */
140
117
141
- for (kk = 0 ; kk < N - M; kk++) {
118
+ for (size_t kk = 0 ; kk < N - M; kk++) {
142
119
y = (mt[kk] & UPPER_MASK) | (mt[kk + 1 ] & LOWER_MASK);
143
120
mt[kk] = mt[kk + M] ^ (y >> 1 ) ^ mag01[y & 0x1UL ];
144
121
}
145
- for (; kk < N - 1 ; kk++) {
122
+ for (size_t kk ; kk < N - 1 ; kk++) {
146
123
y = (mt[kk] & UPPER_MASK) | (mt[kk + 1 ] & LOWER_MASK);
147
124
mt[kk] = mt[kk + (M - N)] ^ (y >> 1 ) ^ mag01[y & 0x1UL ];
148
125
}
@@ -163,32 +140,45 @@ unsigned long spec_genrand_int32() {
163
140
return y;
164
141
}
165
142
166
- /* generates a random number on [0,0x7fffffff]-interval */
167
- long spec_genrand_int31 () {
168
- return (long )(spec_genrand_int32 () >> 1 );
143
+ long SpecRandomNumberGenerator::spec_genrand_int31_ () {
144
+ return (long )(spec_genrand_int32_ () >> 1 );
169
145
}
170
146
171
- /* generates a random number on [0,1]-real-interval */
172
- double spec_genrand_real1 () {
173
- return spec_genrand_int32 () * (1.0 / 4294967295.0 );
147
+ double SpecRandomNumberGenerator::spec_genrand_real1_ () {
148
+ return spec_genrand_int32_ () * (1.0 / 4294967295.0 );
174
149
/* divided by 2^32-1 */
175
150
}
176
151
177
- /* generates a random number on [0,1)-real-interval */
178
- double spec_genrand_real2 () {
179
- return spec_genrand_int32 () * (1.0 / 4294967296.0 );
152
+ double SpecRandomNumberGenerator::spec_genrand_real2_ () {
153
+ return spec_genrand_int32_ () * (1.0 / 4294967296.0 );
180
154
/* divided by 2^32 */
181
155
}
182
156
183
- /* generates a random number on (0,1)-real-interval */
184
- double spec_genrand_real3 () {
185
- return (((double )spec_genrand_int32 ()) + 0.5 ) * (1.0 / 4294967296.0 );
157
+ double SpecRandomNumberGenerator::spec_genrand_real3_ () {
158
+ return (((double )spec_genrand_int32_ ()) + 0.5 ) * (1.0 / 4294967296.0 );
186
159
/* divided by 2^32 */
187
160
}
188
161
189
- /* generates a random number on [0,1) with 53-bit resolution*/
190
- double spec_genrand_res53 () {
191
- unsigned long a = spec_genrand_int32 () >> 5 , b = spec_genrand_int32 () >> 6 ;
162
+ double SpecRandomNumberGenerator::spec_genrand_res53_ () {
163
+ unsigned long a = spec_genrand_int32_ () >> 5 , b = spec_genrand_int32_ () >> 6 ;
192
164
return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0 );
193
165
}
194
- /* These real versions are due to Isaku Wada, 2002/01/09 added */
166
+
167
+ void SpecRandomNumberGenerator::srandom (int seed) {
168
+ spec_init_genrand_ ((unsigned long )seed);
169
+ }
170
+
171
+ int SpecRandomNumberGenerator::irand (int imax) {
172
+ return (int )(spec_genrand_int31_ () % (imax + 1 ));
173
+ }
174
+
175
+ float SpecRandomNumberGenerator::frand () {
176
+ return (float )spec_genrand_real2_ ();
177
+ }
178
+
179
+ SpecRandomNumberGenerator::SpecRandomNumberGenerator (int seed) {
180
+ spec_init_genrand_ ((unsigned long )seed);
181
+ }
182
+
183
+ SpecRandomNumberGenerator::SpecRandomNumberGenerator ()
184
+ : SpecRandomNumberGenerator(0 ) {}
0 commit comments