00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <stdio.h>
00035
00036
00037 #define MT_N 624
00038 #define MT_M 397
00039 #define MT_MATRIX_A 0x9908b0dfUL
00040 #define MT_UPPER_MASK 0x80000000UL
00041 #define MT_LOWER_MASK 0x7fffffffUL
00043 static unsigned long mt[MT_N];
00044 static int mti = MT_N + 1;
00050 static void init_genrand(unsigned long s) {
00051 mt[0] = s & 0xffffffffUL;
00052 for (mti = 1; mti < MT_N; mti++) {
00053 mt[mti] = (1812433253UL * (mt[mti - 1] ^ (mt[mti - 1] >> 30)) + mti);
00054
00055
00056
00057
00058 mt[mti] &= 0xffffffffUL;
00059
00060 }
00061 }
00062
00066 static unsigned long genrand_int32(void) {
00067 unsigned long y;
00068 static unsigned long mag01[2] = { 0x0UL, MT_MATRIX_A };
00069
00070
00071 if (mti >= MT_N) {
00072 int kk;
00073
00074 if (mti == MT_N + 1)
00075 init_genrand(5489UL);
00076
00077 for (kk = 0; kk < MT_N - MT_M; kk++) {
00078 y = (mt[kk] & MT_UPPER_MASK) | (mt[kk + 1] & MT_LOWER_MASK);
00079 mt[kk] = mt[kk + MT_M] ^ (y >> 1) ^ mag01[y & 0x1UL];
00080 }
00081 for (; kk < MT_N - 1; kk++) {
00082 y = (mt[kk] & MT_UPPER_MASK) | (mt[kk + 1] & MT_LOWER_MASK);
00083 mt[kk] = mt[kk + (MT_M - MT_N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
00084 }
00085 y = (mt[MT_N - 1] & MT_UPPER_MASK) | (mt[0] & MT_LOWER_MASK);
00086 mt[MT_N - 1] = mt[MT_M - 1] ^ (y >> 1) ^ mag01[y & 0x1UL];
00087
00088 mti = 0;
00089 }
00090
00091 y = mt[mti++];
00092
00093
00094 y ^= (y >> 11);
00095 y ^= (y << 7) & 0x9d2c5680UL;
00096 y ^= (y << 15) & 0xefc60000UL;
00097 y ^= (y >> 18);
00098
00099 return y;
00100 }
00101
00105 static double genrand_res53(void) {
00106 unsigned long a = genrand_int32() >> 5, b = genrand_int32() >> 6;
00107 return (1.0 * a * 67108864.0 + b) * (1.0 / 9007199254740992.0);
00108 }
00109
00110 #undef MT_N
00111 #undef MT_M
00112 #undef MT_MATRIX_A
00113 #undef MT_UPPER_MASK
00114 #undef MT_LOWER_MASK
00115
00116
00117
00118
00119
00132
00133 #include "mt19937ar.h"
00134
00135
00136 char _mt19937ar_tag[] = "using mt19937ar " MT19937AR_VERSION;
00137
00141 void mt_init_genrand(unsigned long s) {
00142 init_genrand(s);
00143 return;
00144 }
00145
00149 double mt_genrand_res53(void) {
00150 return genrand_res53();
00151 }