@@ -16,7 +16,7 @@ static THGenerator* THGenerator_newUnseeded()
1616 THGenerator * self = THAlloc (sizeof (THGenerator ));
1717 memset (self , 0 , sizeof (THGenerator ));
1818 self -> left = 1 ;
19- self -> initf = 0 ;
19+ self -> seeded = 0 ;
2020 self -> normal_is_valid = 0 ;
2121 return self ;
2222}
@@ -118,7 +118,7 @@ unsigned long THRandom_seed(THGenerator *_generator)
118118*/
119119
120120/* Macros for the Mersenne Twister random generator... */
121- /* Period parameters */
121+ /* Period parameters */
122122/* #define n 624 */
123123/* #define m 397 */
124124#define MATRIX_A 0x9908b0dfUL /* constant vector a */
@@ -149,7 +149,7 @@ void THRandom_manualSeed(THGenerator *_generator, unsigned long the_seed_)
149149 _generator -> state [j ] &= 0xffffffffUL ; /* for >32 bit machines */
150150 }
151151 _generator -> left = 1 ;
152- _generator -> initf = 1 ;
152+ _generator -> seeded = 1 ;
153153}
154154
155155unsigned long THRandom_initialSeed (THGenerator * _generator )
@@ -164,24 +164,34 @@ void THRandom_nextState(THGenerator *_generator)
164164
165165 _generator -> left = n ;
166166 _generator -> next = 0 ;
167-
168- for (j = n - m + 1 ; -- j ; p ++ )
167+
168+ for (j = n - m + 1 ; -- j ; p ++ )
169169 * p = p [m ] ^ TWIST (p [0 ], p [1 ]);
170170
171- for (j = m ; -- j ; p ++ )
171+ for (j = m ; -- j ; p ++ )
172172 * p = p [m - n ] ^ TWIST (p [0 ], p [1 ]);
173173
174174 * p = p [m - n ] ^ TWIST (p [0 ], _generator -> state [0 ]);
175175}
176176
177+ int THRandom_isValidState (THGenerator * _generator )
178+ {
179+ if ((_generator -> seeded == 1 ) &&
180+ (_generator -> left > 0 && _generator -> left <= n ) &&
181+ (_generator -> next >= 0 && _generator -> next <= n ))
182+ return 1 ;
183+
184+ return 0 ;
185+ }
186+
177187unsigned long THRandom_random (THGenerator * _generator )
178188{
179189 unsigned long y ;
180190
181191 if (-- (_generator -> left ) == 0 )
182192 THRandom_nextState (_generator );
183193 y = * (_generator -> state + (_generator -> next )++ );
184-
194+
185195 /* Tempering */
186196 y ^= (y >> 11 );
187197 y ^= (y << 7 ) & 0x9d2c5680UL ;
@@ -205,8 +215,8 @@ static double __uniform__(THGenerator *_generator)
205215 y ^= (y << 7 ) & 0x9d2c5680UL ;
206216 y ^= (y << 15 ) & 0xefc60000UL ;
207217 y ^= (y >> 18 );
208-
209- return (double )y * (1.0 /4294967296.0 );
218+
219+ return (double )y * (1.0 /4294967296.0 );
210220 /* divided by 2^32 */
211221}
212222
@@ -237,7 +247,7 @@ double THRandom_normal(THGenerator *_generator, double mean, double stdv)
237247 }
238248 else
239249 _generator -> normal_is_valid = 0 ;
240-
250+
241251 if (_generator -> normal_is_valid )
242252 return _generator -> normal_rho * cos (2. * M_PI * _generator -> normal_x )* stdv + mean ;
243253 else
0 commit comments