X-Git-Url: https://pd.if.org/git/?p=jsw;a=blobdiff_plain;f=jsw_rand.c;fp=jsw_rand.c;h=24f28e19339bb68bf0f92cb11ba1f7bdbc178075;hp=a50644103866a34317d628b63c184157463d1e6e;hb=9fa959d28f32ae94111296c238b1e76caf152078;hpb=b8dc7e923f9cf71c3c722b872494fe639ba4621f diff --git a/jsw_rand.c b/jsw_rand.c index a506441..24f28e1 100644 --- a/jsw_rand.c +++ b/jsw_rand.c @@ -1,73 +1,73 @@ -#include -#include -#include "jsw_rand.h" - -#define N 624 -#define M 397 -#define A 0x9908b0dfUL -#define U 0x80000000UL -#define L 0x7fffffffUL - -/* Internal state */ -static unsigned long x[N]; -static int next; - -/* Initialize internal state */ -void jsw_seed ( unsigned long s ) -{ - int i; - - x[0] = s & 0xffffffffUL; - - for ( i = 1; i < N; i++ ) { - x[i] = ( 1812433253UL - * ( x[i - 1] ^ ( x[i - 1] >> 30 ) ) + i ); - x[i] &= 0xffffffffUL; - } -} - -/* Mersenne Twister */ -unsigned long jsw_rand ( void ) -{ - unsigned long y, a; - int i; - - /* Refill x if exhausted */ - if ( next == N ) { - next = 0; - - for ( i = 0; i < N - 1; i++ ) { - y = ( x[i] & U ) | x[i + 1] & L; - a = ( y & 0x1UL ) ? A : 0x0UL; - x[i] = x[( i + M ) % N] ^ ( y >> 1 ) ^ a; - } - - y = ( x[N - 1] & U ) | x[0] & L; - a = ( y & 0x1UL ) ? A : 0x0UL; - x[N - 1] = x[M - 1] ^ ( y >> 1 ) ^ a; - } - - y = x[next++]; - - /* Improve distribution */ - y ^= (y >> 11); - y ^= (y << 7) & 0x9d2c5680UL; - y ^= (y << 15) & 0xefc60000UL; - y ^= (y >> 18); - - return y; -} - -/* Portable time seed */ -unsigned jsw_time_seed() -{ - time_t now = time ( 0 ); - unsigned char *p = (unsigned char *)&now; - unsigned seed = 0; - size_t i; - - for ( i = 0; i < sizeof now; i++ ) - seed = seed * ( UCHAR_MAX + 2U ) + p[i]; - - return seed; +#include +#include +#include "jsw_rand.h" + +#define N 624 +#define M 397 +#define A 0x9908b0dfUL +#define U 0x80000000UL +#define L 0x7fffffffUL + +/* Internal state */ +static unsigned long x[N]; +static int next; + +/* Initialize internal state */ +void jsw_seed ( unsigned long s ) +{ + int i; + + x[0] = s & 0xffffffffUL; + + for ( i = 1; i < N; i++ ) { + x[i] = ( 1812433253UL + * ( x[i - 1] ^ ( x[i - 1] >> 30 ) ) + i ); + x[i] &= 0xffffffffUL; + } +} + +/* Mersenne Twister */ +unsigned long jsw_rand ( void ) +{ + unsigned long y, a; + int i; + + /* Refill x if exhausted */ + if ( next == N ) { + next = 0; + + for ( i = 0; i < N - 1; i++ ) { + y = ( x[i] & U ) | x[i + 1] & L; + a = ( y & 0x1UL ) ? A : 0x0UL; + x[i] = x[( i + M ) % N] ^ ( y >> 1 ) ^ a; + } + + y = ( x[N - 1] & U ) | x[0] & L; + a = ( y & 0x1UL ) ? A : 0x0UL; + x[N - 1] = x[M - 1] ^ ( y >> 1 ) ^ a; + } + + y = x[next++]; + + /* Improve distribution */ + y ^= (y >> 11); + y ^= (y << 7) & 0x9d2c5680UL; + y ^= (y << 15) & 0xefc60000UL; + y ^= (y >> 18); + + return y; +} + +/* Portable time seed */ +unsigned jsw_time_seed() +{ + time_t now = time ( 0 ); + unsigned char *p = (unsigned char *)&now; + unsigned seed = 0; + size_t i; + + for ( i = 0; i < sizeof now; i++ ) + seed = seed * ( UCHAR_MAX + 2U ) + p[i]; + + return seed; } \ No newline at end of file