00001
00040 #include <stdio.h>
00041 #include <stdlib.h>
00042 #include <string.h>
00043 #include "Rand.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #define N (624) // length of state vector
00054 #define M (397) // a period parameter
00055 #define K (0x9908B0DFU) // a magic constant
00056 #define hiBit(u) ((u) & 0x80000000U) // mask all but highest bit of u
00057 #define loBit(u) ((u) & 0x00000001U) // mask all but lowest bit of u
00058 #define loBits(u) ((u) & 0x7FFFFFFFU) // mask the highest bit of u
00059 #define mixBits(u, v) (hiBit(u)|loBits(v)) // move hi bit of u to hi bit of v
00060
00061 static unsigned int _state[ N + 1 ];
00062 static unsigned int *_next;
00063 static int _left = -1;
00064
00065 void seedMT( unsigned int seed, unsigned int *state, unsigned int *&next, int &left );
00066 unsigned int reloadMT( unsigned int *state, unsigned int *&next, int &left );
00067 unsigned int randomMT( unsigned int *state, unsigned int *&next, int &left );
00068 void fillBufferMT( void *buffer, unsigned int bytes, unsigned int *state, unsigned int *&next, int &left );
00069 float frandomMT( unsigned int *state, unsigned int *&next, int &left );
00070
00071
00072 void seedMT( unsigned int seed )
00073 {
00074 seedMT(seed, _state, _next, _left);
00075 }
00076 unsigned int reloadMT( void )
00077 {
00078 return reloadMT(_state, _next, _left);
00079 }
00080 unsigned int randomMT( void )
00081 {
00082 return randomMT(_state, _next, _left);
00083 }
00084 float frandomMT( void )
00085 {
00086 return frandomMT(_state, _next, _left);
00087 }
00088 void fillBufferMT( void *buffer, unsigned int bytes )
00089 {
00090 fillBufferMT(buffer, bytes, _state, _next, _left);
00091 }
00092
00093 void seedMT( unsigned int seed, unsigned int *state, unsigned int *&next, int &left )
00094 {
00095 (void) next;
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 register unsigned int x = ( seed | 1U ) & 0xFFFFFFFFU, *s = state;
00144 register int j;
00145
00146 for ( left = 0, *s++ = x, j = N; --j;
00147 *s++ = ( x *= 69069U ) & 0xFFFFFFFFU )
00148
00149 ;
00150 }
00151
00152
00153 unsigned int reloadMT( unsigned int *state, unsigned int *&next, int &left )
00154 {
00155 register unsigned int * p0 = state, *p2 = state + 2, *pM = state + M, s0, s1;
00156 register int j;
00157
00158 if ( left < -1 )
00159 seedMT( 4357U );
00160
00161 left = N - 1, next = state + 1;
00162
00163 for ( s0 = state[ 0 ], s1 = state[ 1 ], j = N - M + 1; --j; s0 = s1, s1 = *p2++ )
00164 * p0++ = *pM++ ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0U );
00165
00166 for ( pM = state, j = M; --j; s0 = s1, s1 = *p2++ )
00167 * p0++ = *pM++ ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0U );
00168
00169 s1 = state[ 0 ], *p0 = *pM ^ ( mixBits( s0, s1 ) >> 1 ) ^ ( loBit( s1 ) ? K : 0U );
00170
00171 s1 ^= ( s1 >> 11 );
00172
00173 s1 ^= ( s1 << 7 ) & 0x9D2C5680U;
00174
00175 s1 ^= ( s1 << 15 ) & 0xEFC60000U;
00176
00177 return ( s1 ^ ( s1 >> 18 ) );
00178 }
00179
00180
00181 unsigned int randomMT( unsigned int *state, unsigned int *&next, int &left )
00182 {
00183 unsigned int y;
00184
00185 if ( --left < 0 )
00186 return ( reloadMT(state, next, left) );
00187
00188 y = *next++;
00189
00190 y ^= ( y >> 11 );
00191
00192 y ^= ( y << 7 ) & 0x9D2C5680U;
00193
00194 y ^= ( y << 15 ) & 0xEFC60000U;
00195
00196 return ( y ^ ( y >> 18 ) );
00197
00198
00199
00200 }
00201
00202 void fillBufferMT( void *buffer, unsigned int bytes, unsigned int *state, unsigned int *&next, int &left )
00203 {
00204 unsigned int offset=0;
00205 unsigned int r;
00206 while (bytes-offset>=sizeof(r))
00207 {
00208 r = randomMT();
00209 memcpy((char*)buffer+offset, &r, sizeof(r));
00210 offset+=sizeof(r);
00211 }
00212
00213 r = randomMT(state, next, left);
00214 memcpy((char*)buffer+offset, &r, bytes-offset);
00215 }
00216
00217 float frandomMT( unsigned int *state, unsigned int *&next, int &left )
00218 {
00219 return ( float ) ( ( double ) randomMT(state, next, left) / 4294967296.0 );
00220 }
00221 RakNetRandom::RakNetRandom()
00222 {
00223 left=-1;
00224 }
00225 RakNetRandom::~RakNetRandom()
00226 {
00227 }
00228 void RakNetRandom::SeedMT( unsigned int seed )
00229 {
00230 seedMT(seed, state, next, left);
00231 }
00232
00233 unsigned int RakNetRandom::ReloadMT( void )
00234 {
00235 return reloadMT(state, next, left);
00236 }
00237
00238 unsigned int RakNetRandom::RandomMT( void )
00239 {
00240 return randomMT(state, next, left);
00241 }
00242
00243 float RakNetRandom::FrandomMT( void )
00244 {
00245 return frandomMT(state, next, left);
00246 }
00247
00248 void RakNetRandom::FillBufferMT( void *buffer, unsigned int bytes )
00249 {
00250 fillBufferMT(buffer, bytes, state, next, left);
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271