[2035] | 1 | #ifdef WIN32 |
---|
| 2 | |
---|
| 3 | #include <lemon/bits/mingw32_rand.h> |
---|
| 4 | |
---|
| 5 | |
---|
| 6 | static unsigned short _mingw_rand_state[10]; |
---|
| 7 | |
---|
| 8 | void _mingw_rand_next_state(unsigned short xsubi[3]) { |
---|
| 9 | _mingw_rand_state[8] = _mingw_rand_state[9] = 0; |
---|
| 10 | _mingw_rand_state[7] = _mingw_rand_state[6]; |
---|
| 11 | for (int i = 0; i < 3; ++i) { |
---|
| 12 | unsigned long val = 0; |
---|
| 13 | for (int j = 0; i + j < 3; ++j) { |
---|
| 14 | val += (unsigned long)_mingw_rand_state[7 + i + j] |
---|
| 15 | + (unsigned long)xsubi[i] * (unsigned long)_mingw_rand_state[3 + j]; |
---|
| 16 | _mingw_rand_state[7 + i + j] = val; |
---|
| 17 | val >>= 16; |
---|
| 18 | } |
---|
| 19 | } |
---|
| 20 | xsubi[0] = _mingw_rand_state[6]; |
---|
| 21 | xsubi[1] = _mingw_rand_state[7]; |
---|
| 22 | xsubi[2] = _mingw_rand_state[8]; |
---|
| 23 | } |
---|
| 24 | |
---|
| 25 | long int lrand48(void) { |
---|
| 26 | return nrand48(_mingw_rand_state); |
---|
| 27 | } |
---|
| 28 | |
---|
| 29 | long int nrand48(unsigned short xsubi[3]) { |
---|
| 30 | _mingw_rand_next_state(xsubi); |
---|
| 31 | return ((long)(xsubi[2] & ( (1 << 15) - 1) ) << 16) | (long)xsubi[1]; |
---|
| 32 | } |
---|
| 33 | |
---|
| 34 | double drand48(void) { |
---|
| 35 | return erand48(_mingw_rand_state); |
---|
| 36 | } |
---|
| 37 | |
---|
| 38 | double erand48(unsigned short xsubi[3]) { |
---|
| 39 | return (double)nrand48(xsubi) / (1 << 31); |
---|
| 40 | } |
---|
| 41 | |
---|
| 42 | |
---|
| 43 | long int mrand48(void) { |
---|
| 44 | return jrand48(_mingw_rand_state); |
---|
| 45 | } |
---|
| 46 | |
---|
| 47 | long int jrand48(unsigned short xsubi[3]) { |
---|
| 48 | _mingw_rand_next_state(xsubi); |
---|
| 49 | return ((long)xsubi[2] << 16) | (long)xsubi[1]; |
---|
| 50 | } |
---|
| 51 | |
---|
| 52 | void srand48(long int seedval) { |
---|
| 53 | _mingw_rand_state[0] = 0x330E; |
---|
| 54 | _mingw_rand_state[1] = seedval & ( (1 << 16) - 1); |
---|
| 55 | _mingw_rand_state[2] = seedval >> 16; |
---|
| 56 | _mingw_rand_state[3] = 0xE66D; |
---|
| 57 | _mingw_rand_state[4] = 0xDEEC; |
---|
| 58 | _mingw_rand_state[5] = 0x0005; |
---|
| 59 | _mingw_rand_state[6] = 0x000B; |
---|
| 60 | } |
---|
| 61 | |
---|
| 62 | unsigned short *seed48(unsigned short seed16v[3]) { |
---|
| 63 | _mingw_rand_state[7] = _mingw_rand_state[0]; |
---|
| 64 | _mingw_rand_state[8] = _mingw_rand_state[1]; |
---|
| 65 | _mingw_rand_state[9] = _mingw_rand_state[2]; |
---|
| 66 | _mingw_rand_state[0] = seed16v[0]; |
---|
| 67 | _mingw_rand_state[1] = seed16v[1]; |
---|
| 68 | _mingw_rand_state[2] = seed16v[2]; |
---|
| 69 | return _mingw_rand_state + 7; |
---|
| 70 | } |
---|
| 71 | |
---|
| 72 | void lcong48(unsigned short param[7]) { |
---|
| 73 | _mingw_rand_state[0] = param[0]; |
---|
| 74 | _mingw_rand_state[1] = param[1]; |
---|
| 75 | _mingw_rand_state[2] = param[2]; |
---|
| 76 | _mingw_rand_state[3] = param[3]; |
---|
| 77 | _mingw_rand_state[4] = param[4]; |
---|
| 78 | _mingw_rand_state[5] = param[5]; |
---|
| 79 | _mingw_rand_state[6] = param[6]; |
---|
| 80 | } |
---|
| 81 | |
---|
| 82 | |
---|
| 83 | #endif |
---|