5252
5353#include " specrand.h"
5454
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 );
6757}
6858
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 );
7261}
7362
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) {
8164 mt[0 ] = s & 0xffffffffUL ;
8265 for (mti = 1 ; mti < N; mti++) {
8366 mt[mti] = (1812433253UL * (mt[mti - 1 ] ^ (mt[mti - 1 ] >> 30 )) + mti);
@@ -90,16 +73,11 @@ void spec_init_genrand(unsigned long s) {
9073 }
9174}
9275
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);
10381 for (; k; k--) {
10482 mt[i] = (mt[i] ^ ((mt[i - 1 ] ^ (mt[i - 1 ] >> 30 )) * 1664525UL ))
10583 + init_key[j] + j; /* non linear */
@@ -127,22 +105,21 @@ void spec_init_by_array(unsigned long init_key[], int key_length) {
127105}
128106
129107/* generates a random number on [0,0xffffffff]-interval */
130- unsigned long spec_genrand_int32 () {
108+ unsigned long SpecRandomNumberGenerator::spec_genrand_int32_ () {
131109 unsigned long y;
132110 static unsigned long mag01[2 ] = {0x0UL , MATRIX_A};
133111 /* mag01[x] = x * MATRIX_A for x=0,1 */
134112
135113 if (mti >= N) { /* generate N words at one time */
136- int kk;
137114
138115 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 */
140117
141- for (kk = 0 ; kk < N - M; kk++) {
118+ for (size_t kk = 0 ; kk < N - M; kk++) {
142119 y = (mt[kk] & UPPER_MASK) | (mt[kk + 1 ] & LOWER_MASK);
143120 mt[kk] = mt[kk + M] ^ (y >> 1 ) ^ mag01[y & 0x1UL ];
144121 }
145- for (; kk < N - 1 ; kk++) {
122+ for (size_t kk ; kk < N - 1 ; kk++) {
146123 y = (mt[kk] & UPPER_MASK) | (mt[kk + 1 ] & LOWER_MASK);
147124 mt[kk] = mt[kk + (M - N)] ^ (y >> 1 ) ^ mag01[y & 0x1UL ];
148125 }
@@ -163,32 +140,45 @@ unsigned long spec_genrand_int32() {
163140 return y;
164141}
165142
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 );
169145}
170146
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 );
174149 /* divided by 2^32-1 */
175150}
176151
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 );
180154 /* divided by 2^32 */
181155}
182156
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 );
186159 /* divided by 2^32 */
187160}
188161
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 ;
192164 return (a * 67108864.0 + b) * (1.0 / 9007199254740992.0 );
193165}
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