| /* |
| 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. |
| |
| Before using, initialize the state by using srand(seed). |
| |
| Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, |
| All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions |
| are met: |
| |
| 1. Redistributions of source code must retain the above copyright |
| notice, this list of conditions and the following disclaimer. |
| |
| 2. Redistributions in binary form must reproduce the above copyright |
| 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 |
| permission. |
| |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| Any feedback is very welcome. |
| http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html |
| email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) |
| */ |
| |
| /* |
| Adapted to Rockbox by Jens Arnold |
| */ |
| |
| #include <stdlib.h> |
| |
| /* Period parameters */ |
| #define N 624 |
| #define M 397 |
| #define MATRIX_A 0x9908b0dfUL /* constant vector a */ |
| #define UMASK 0x80000000UL /* most significant w-r bits */ |
| #define LMASK 0x7fffffffUL /* least significant r bits */ |
| #define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) ) |
| #define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL)) |
| |
| static unsigned long state[N]; /* the array for the state vector */ |
| static int left = 0; |
| static unsigned long *next; |
| |
| /* initializes state[N] with a seed */ |
| void srand(unsigned int seed) |
| { |
| unsigned long x = seed & 0xffffffffUL; |
| unsigned long *s = state; |
| int j; |
| |
| for (*s++ = x, j = 1; j < N; j++) { |
| x = (1812433253UL * (x ^ (x >> 30)) + j) & 0xffffffffUL; |
| *s++ = x; |
| /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ |
| /* In the previous versions, MSBs of the seed affect */ |
| /* only MSBs of the array state[]. */ |
| /* 2002/01/09 modified by Makoto Matsumoto */ |
| } |
| left = 1; |
| } |
| |
| static void next_state(void) |
| { |
| unsigned long *p = state; |
| int j; |
| |
| /* if srand() has not been called, */ |
| /* a default initial seed is used */ |
| if (left < 0) |
| srand(5489UL); |
| |
| left = N; |
| next = state; |
| |
| 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[0]); |
| } |
| |
| /* generates a random number on [0,RAND_MAX]-interval */ |
| int rand(void) |
| { |
| unsigned long y; |
| |
| if (--left <= 0) |
| next_state(); |
| y = *next++; |
| |
| /* Tempering */ |
| y ^= (y >> 11); |
| y ^= (y << 7) & 0x9d2c5680UL; |
| y ^= (y << 15) & 0xefc60000UL; |
| y ^= (y >> 18); |
| |
| return ((unsigned int)y) >> 1; |
| } |