1313/* Creates (unseeded) new generator*/
1414static THGenerator* THGenerator_newUnseeded ()
1515{
16- THGenerator * self = THAlloc (sizeof (THGenerator ));
16+ THGenerator *self = (THGenerator *) THAlloc (sizeof (THGenerator));
1717 memset (self, 0 , sizeof (THGenerator));
18- self -> left = 1 ;
19- self -> seeded = 0 ;
20- self -> normal_is_valid = 0 ;
18+ self->gen_state .left = 1 ;
19+ self->gen_state .seeded = 0 ;
20+ self->gen_state .normal_is_valid = 0 ;
21+ new (&self->mutex ) std::mutex ();
2122 return self;
2223}
2324
@@ -31,24 +32,31 @@ THGenerator* THGenerator_new()
3132
3233THGenerator* THGenerator_copy (THGenerator *self, THGenerator *from)
3334{
34- memcpy ( self , from , sizeof ( THGenerator ) );
35+ THGeneratorState_copy (& self-> gen_state , & from-> gen_state );
3536 return self;
3637}
3738
3839void THGenerator_free (THGenerator *self)
3940{
41+ self->mutex .~mutex ();
4042 THFree (self);
4143}
4244
43- int THGenerator_isValid ( THGenerator * _generator )
45+ int THGeneratorState_isValid (THGeneratorState *_gen_state )
4446{
45- if ((_generator -> seeded == 1 ) &&
46- (_generator -> left > 0 && _generator -> left <= n ) && (_generator -> next <= n ))
47+ if ((_gen_state ->seeded == 1 ) &&
48+ (_gen_state ->left > 0 && _gen_state ->left <= n) && (_gen_state ->next <= n))
4749 return 1 ;
4850
4951 return 0 ;
5052}
5153
54+ THGeneratorState* THGeneratorState_copy (THGeneratorState *self, THGeneratorState *from)
55+ {
56+ memcpy (self, from, sizeof (THGeneratorState));
57+ return self;
58+ }
59+
5260#ifndef _WIN32
5361static uint64_t readURandomLong ()
5462{
@@ -146,41 +154,41 @@ void THRandom_manualSeed(THGenerator *_generator, uint64_t the_seed_)
146154 THGenerator_copy (_generator, blank);
147155 THGenerator_free (blank);
148156
149- _generator -> the_initial_seed = the_seed_ ;
150- _generator -> state [0 ] = _generator -> the_initial_seed & 0xffffffffUL ;
157+ _generator->gen_state . the_initial_seed = the_seed_;
158+ _generator->gen_state . state [0 ] = _generator->gen_state . the_initial_seed & 0xffffffffUL ;
151159 for (j = 1 ; j < n; j++)
152160 {
153- _generator -> state [j ] = (1812433253UL * (_generator -> state [j - 1 ] ^ (_generator -> state [j - 1 ] >> 30 )) + j );
161+ _generator->gen_state . state [j] = (1812433253UL * (_generator->gen_state . state [j-1 ] ^ (_generator->gen_state . state [j-1 ] >> 30 )) + j);
154162 /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
155163 /* In the previous versions, mSBs of the seed affect */
156164 /* only mSBs of the array state[]. */
157165 /* 2002/01/09 modified by makoto matsumoto */
158- _generator -> state [j ] &= 0xffffffffUL ; /* for >32 bit machines */
166+ _generator->gen_state . state [j] &= 0xffffffffUL ; /* for >32 bit machines */
159167 }
160- _generator -> left = 1 ;
161- _generator -> seeded = 1 ;
168+ _generator->gen_state . left = 1 ;
169+ _generator->gen_state . seeded = 1 ;
162170}
163171
164172uint64_t THRandom_initialSeed (THGenerator *_generator)
165173{
166- return _generator -> the_initial_seed ;
174+ return _generator->gen_state . the_initial_seed ;
167175}
168176
169177void THRandom_nextState (THGenerator *_generator)
170178{
171- uint64_t * p = _generator -> state ;
179+ uint64_t *p = _generator->gen_state . state ;
172180 int j;
173181
174- _generator -> left = n ;
175- _generator -> next = 0 ;
182+ _generator->gen_state . left = n;
183+ _generator->gen_state . next = 0 ;
176184
177185 for (j = n-m+1 ; --j; p++)
178186 *p = p[m] ^ TWIST (p[0 ], p[1 ]);
179187
180188 for (j = m; --j; p++)
181189 *p = p[m-n] ^ TWIST (p[0 ], p[1 ]);
182190
183- * p = p [m - n ] ^ TWIST (p [0 ], _generator -> state [0 ]);
191+ *p = p[m-n] ^ TWIST (p[0 ], _generator->gen_state . state [0 ]);
184192}
185193
186194// TODO: this only returns 32-bits of randomness but as a uint64_t. This is
@@ -190,9 +198,9 @@ uint64_t THRandom_random(THGenerator *_generator)
190198{
191199 uint64_t y;
192200
193- if (-- (_generator -> left ) == 0 )
201+ if (--(_generator->gen_state . left ) == 0 )
194202 THRandom_nextState (_generator);
195- y = * (_generator -> state + (_generator -> next )++ );
203+ y = *(_generator->gen_state . state + (_generator->gen_state . next )++);
196204
197205 /* Tempering */
198206 y ^= (y >> 11 );
@@ -260,20 +268,20 @@ double THRandom_normal(THGenerator *_generator, double mean, double stdv)
260268 THArgCheck (stdv > 0 , 2 , " standard deviation must be strictly positive" );
261269
262270 /* This is known as the Box-Muller method */
263- if (!_generator -> normal_is_valid )
271+ if (!_generator->gen_state . normal_is_valid )
264272 {
265- _generator -> normal_x = uniform_double (_generator );
266- _generator -> normal_y = uniform_double (_generator );
267- _generator -> normal_rho = sqrt (-2. * log (1.0 - _generator -> normal_y ));
268- _generator -> normal_is_valid = 1 ;
273+ _generator->gen_state . normal_x = uniform_double (_generator);
274+ _generator->gen_state . normal_y = uniform_double (_generator);
275+ _generator->gen_state . normal_rho = sqrt (-2 . * log (1.0 -_generator->gen_state . normal_y ));
276+ _generator->gen_state . normal_is_valid = 1 ;
269277 }
270278 else
271- _generator -> normal_is_valid = 0 ;
279+ _generator->gen_state . normal_is_valid = 0 ;
272280
273- if (_generator -> normal_is_valid )
274- return _generator -> normal_rho * cos (2. * M_PI * _generator -> normal_x )* stdv + mean ;
281+ if (_generator->gen_state . normal_is_valid )
282+ return _generator->gen_state . normal_rho *cos (2 .*M_PI*_generator->gen_state . normal_x )*stdv+mean;
275283 else
276- return _generator -> normal_rho * sin (2. * M_PI * _generator -> normal_x )* stdv + mean ;
284+ return _generator->gen_state . normal_rho *sin (2 .*M_PI*_generator->gen_state . normal_x )*stdv+mean;
277285}
278286
279287double THRandom_exponential (THGenerator *_generator, double lambda)
0 commit comments