summaryrefslogtreecommitdiffstats
path: root/src/mt19937ar-cok/mt19937ar-cok.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mt19937ar-cok/mt19937ar-cok.c')
-rw-r--r--src/mt19937ar-cok/mt19937ar-cok.c140
1 files changed, 78 insertions, 62 deletions
diff --git a/src/mt19937ar-cok/mt19937ar-cok.c b/src/mt19937ar-cok/mt19937ar-cok.c
index 63ef659..af8cc75 100644
--- a/src/mt19937ar-cok/mt19937ar-cok.c
+++ b/src/mt19937ar-cok/mt19937ar-cok.c
@@ -1,16 +1,16 @@
-/*
- This code is modified for use in nwipe.
+/*
+ This code is modified for use in nwipe.
A C-program for MT19937, with initialization improved 2002/2/10.
Coded by Takuji Nishimura and Makoto Matsumoto.
This is a faster version by taking Shawn Cokus's optimization,
Matthe Bellew's simplification, Isaku Wada's real version.
- Before using, initialize the state by using init_genrand(seed)
+ Before using, initialize the state by using init_genrand(seed)
or init_by_array(init_key, key_length).
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
- All rights reserved.
+ All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -23,8 +23,8 @@
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
- 3. The names of its contributors may not be used to endorse or promote
- products derived from this software without specific prior written
+ 3. The names of its contributors may not be used to endorse or promote
+ products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
@@ -48,77 +48,89 @@
#include <stdio.h>
#include "mt19937ar-cok.h"
-/* initializes state[N] with a seed */
-void init_genrand( twister_state_t* state, unsigned long s)
+/* initializes state[MT_STATE_SIZE] with a seed */
+void init_genrand( twister_state_t* state, unsigned long s )
{
- int j;
- state->array[0]= s & 0xffffffffUL;
- for( j = 1; j < N; j++ )
- {
- state->array[j] = (1812433253UL * (state->array[j-1] ^ (state->array[j-1] >> 30)) + j);
- state->array[j] &= 0xffffffffUL; /* for >32 bit machines */
- }
- state->left = 1;
- state->initf = 1;
+ int j;
+ state->array[0] = s & 0xffffffffUL;
+ for( j = 1; j < MT_STATE_SIZE; j++ )
+ {
+ state->array[j] = ( 1812433253UL * ( state->array[j - 1] ^ ( state->array[j - 1] >> 30 ) ) + j );
+ state->array[j] &= 0xffffffffUL; /* for >32 bit machines */
+ }
+ state->left = 1;
+ state->initf = 1;
}
-
void twister_init( twister_state_t* state, unsigned long init_key[], unsigned long key_length )
{
int i = 1;
- int j = 0;
- int k = ( N > key_length ? N : key_length );
+ int j = 0;
+ int k = ( MT_STATE_SIZE > key_length ? MT_STATE_SIZE : key_length );
init_genrand( state, 19650218UL );
for( ; k; k-- )
- {
- state->array[i] = (state->array[i] ^ ((state->array[i-1] ^ (state->array[i-1] >> 30)) * 1664525UL)) + init_key[j] + j;
- state->array[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
- ++i;
- ++j;
-
- if ( i >= N )
- {
- state->array[0] = state->array[N-1];
- i = 1;
- }
-
- if ( j >= key_length )
- {
- j = 0;
- }
+ {
+ state->array[i] = ( state->array[i] ^ ( ( state->array[i - 1] ^ ( state->array[i - 1] >> 30 ) ) * 1664525UL ) )
+ + init_key[j] + j;
+ state->array[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+ ++i;
+ ++j;
+
+ if( i >= MT_STATE_SIZE )
+ {
+ state->array[0] = state->array[MT_STATE_SIZE - 1];
+ i = 1;
+ }
+
+ if( j >= key_length )
+ {
+ j = 0;
+ }
}
- for( k = N -1; k; k-- )
- {
- state->array[i] = (state->array[i] ^ ((state->array[i-1] ^ (state->array[i-1] >> 30)) * 1566083941UL)) - i;
- state->array[i] &= 0xffffffffUL;
- ++i;
-
- if ( i >= N )
- {
- state->array[0] = state->array[N-1];
- i = 1;
- }
+ for( k = MT_STATE_SIZE - 1; k; k-- )
+ {
+ state->array[i] =
+ ( state->array[i] ^ ( ( state->array[i - 1] ^ ( state->array[i - 1] >> 30 ) ) * 1566083941UL ) ) - i;
+ state->array[i] &= 0xffffffffUL;
+ ++i;
+
+ if( i >= MT_STATE_SIZE )
+ {
+ state->array[0] = state->array[MT_STATE_SIZE - 1];
+ i = 1;
+ }
}
- state->array[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
- state->left = 1;
- state->initf = 1;
+ state->array[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
+ state->left = 1;
+ state->initf = 1;
}
static void next_state( twister_state_t* state )
{
- unsigned long *p = state->array;
+ unsigned long* p = state->array;
int j;
- if( state->initf == 0) { init_genrand( state, 5489UL ); }
- state->left = N;
+ // Ensures the generator is initialized
+ if( state->initf == 0 )
+ {
+ init_genrand( state, 5489UL );
+ }
+ state->left = MT_STATE_SIZE;
state->next = state->array;
- for( j = N - M + 1; --j; p++ ) { *p = p[M] ^ TWIST(p[0], p[1]); }
- for( j = M; --j; p++ ) { *p = p[M-N] ^ TWIST(p[0], p[1]); }
- *p = p[M-N] ^ TWIST(p[0], state->array[0]);
+
+ for( j = MT_STATE_SIZE - MT_MIDDLE_WORD + 1; --j; p++ )
+ {
+ *p = p[MT_MIDDLE_WORD] ^ TWIST( p[0], p[1] );
+ }
+ for( j = MT_MIDDLE_WORD; --j; p++ )
+ {
+ *p = p[MT_MIDDLE_WORD - MT_STATE_SIZE] ^ TWIST( p[0], p[1] );
+ }
+ *p = p[MT_MIDDLE_WORD - MT_STATE_SIZE] ^ TWIST( p[0], state->array[0] );
}
/* generates a random number on [0,0xffffffff]-interval */
@@ -126,14 +138,18 @@ unsigned long twister_genrand_int32( twister_state_t* state )
{
unsigned long y;
- if ( --state->left == 0 ) { next_state( state ); }
+ // Advance internal state if necessary
+ if( --state->left == 0 )
+ {
+ next_state( state );
+ }
y = *state->next++;
- /* Tempering */
- y ^= (y >> 11);
- y ^= (y << 7) & 0x9d2c5680UL;
- y ^= (y << 15) & 0xefc60000UL;
- y ^= (y >> 18);
+ // Tempering
+ y ^= ( y >> 11 );
+ y ^= ( y << 7 ) & 0x9d2c5680UL;
+ y ^= ( y << 15 ) & 0xefc60000UL;
+ y ^= ( y >> 18 );
return y;
}