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
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include <stdio.h>
00047
00048
00049 #define N 624
00050 #define M 397
00051 #define MATRIX_A 0x9908b0dfUL
00052 #define UMASK 0x80000000UL
00053 #define LMASK 0x7fffffffUL
00054 #define MIXBITS(u,v) ( ((u) & UMASK) | ((v) & LMASK) )
00055 #define TWIST(u,v) ((MIXBITS(u,v) >> 1) ^ ((v)&1UL ? MATRIX_A : 0UL))
00056
00057 static unsigned long state[N];
00058 static int left = 1;
00059 static int initf = 0;
00060 static unsigned long *next;
00061
00062
00063 void init_genrand(unsigned long s)
00064 {
00065 int j;
00066 state[0]= s & 0xffffffffUL;
00067 for (j=1; j<N; j++) {
00068 state[j] = (1812433253UL * (state[j-1] ^ (state[j-1] >> 30)) + j);
00069
00070
00071
00072
00073 state[j] &= 0xffffffffUL;
00074 }
00075 left = 1; initf = 1;
00076 }
00077
00078
00079
00080
00081
00082 void init_by_array(unsigned long init_key[], int key_length)
00083 {
00084 int i, j, k;
00085 init_genrand(19650218UL);
00086 i=1; j=0;
00087 k = (N>key_length ? N : key_length);
00088 for (; k; k--) {
00089 state[i] = (state[i] ^ ((state[i-1] ^ (state[i-1] >> 30)) * 1664525UL))
00090 + init_key[j] + j;
00091 state[i] &= 0xffffffffUL;
00092 i++; j++;
00093 if (i>=N) { state[0] = state[N-1]; i=1; }
00094 if (j>=key_length) j=0;
00095 }
00096 for (k=N-1; k; k--) {
00097 state[i] = (state[i] ^ ((state[i-1] ^ (state[i-1] >> 30)) * 1566083941UL))
00098 - i;
00099 state[i] &= 0xffffffffUL;
00100 i++;
00101 if (i>=N) { state[0] = state[N-1]; i=1; }
00102 }
00103
00104 state[0] = 0x80000000UL;
00105 left = 1; initf = 1;
00106 }
00107
00108 static void next_state(void)
00109 {
00110 unsigned long *p=state;
00111 int j;
00112
00113
00114
00115 if (initf==0) init_genrand(5489UL);
00116
00117 left = N;
00118 next = state;
00119
00120 for (j=N-M+1; --j; p++)
00121 *p = p[M] ^ TWIST(p[0], p[1]);
00122
00123 for (j=M; --j; p++)
00124 *p = p[M-N] ^ TWIST(p[0], p[1]);
00125
00126 *p = p[M-N] ^ TWIST(p[0], state[0]);
00127 }
00128
00129
00130 unsigned long genrand_int32(void)
00131 {
00132 unsigned long y;
00133
00134 if (--left == 0) next_state();
00135 y = *next++;
00136
00137
00138 y ^= (y >> 11);
00139 y ^= (y << 7) & 0x9d2c5680UL;
00140 y ^= (y << 15) & 0xefc60000UL;
00141 y ^= (y >> 18);
00142
00143 return y;
00144 }
00145
00146
00147 long genrand_int31(void)
00148 {
00149 unsigned long y;
00150
00151 if (--left == 0) next_state();
00152 y = *next++;
00153
00154
00155 y ^= (y >> 11);
00156 y ^= (y << 7) & 0x9d2c5680UL;
00157 y ^= (y << 15) & 0xefc60000UL;
00158 y ^= (y >> 18);
00159
00160 return (long)(y>>1);
00161 }
00162
00163
00164 double genrand_real1(void)
00165 {
00166 unsigned long y;
00167
00168 if (--left == 0) next_state();
00169 y = *next++;
00170
00171
00172 y ^= (y >> 11);
00173 y ^= (y << 7) & 0x9d2c5680UL;
00174 y ^= (y << 15) & 0xefc60000UL;
00175 y ^= (y >> 18);
00176
00177 return (double)y * (1.0/4294967295.0);
00178
00179 }
00180
00181
00182 double genrand_real2(void)
00183 {
00184 unsigned long y;
00185
00186 if (--left == 0) next_state();
00187 y = *next++;
00188
00189
00190 y ^= (y >> 11);
00191 y ^= (y << 7) & 0x9d2c5680UL;
00192 y ^= (y << 15) & 0xefc60000UL;
00193 y ^= (y >> 18);
00194
00195 return (double)y * (1.0/4294967296.0);
00196
00197 }
00198
00199
00200 double genrand_real3(void)
00201 {
00202 unsigned long y;
00203
00204 if (--left == 0) next_state();
00205 y = *next++;
00206
00207
00208 y ^= (y >> 11);
00209 y ^= (y << 7) & 0x9d2c5680UL;
00210 y ^= (y << 15) & 0xefc60000UL;
00211 y ^= (y >> 18);
00212
00213 return ((double)y + 0.5) * (1.0/4294967296.0);
00214
00215 }
00216
00217
00218 double genrand_res53(void)
00219 {
00220 unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
00221 return(a*67108864.0+b)*(1.0/9007199254740992.0);
00222 }
00223
00224 #ifdef MERSENNE_MAIN
00225 int main(void)
00226 {
00227 int i;
00228 unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4;
00229 init_by_array(init, length);
00230
00231
00232
00233 printf("1000 outputs of genrand_int32()\n");
00234 for (i=0; i<1000; i++) {
00235 printf("%10lu ", genrand_int32());
00236 if (i%5==4) printf("\n");
00237 }
00238 printf("\n1000 outputs of genrand_real2()\n");
00239 for (i=0; i<1000; i++) {
00240 printf("%10.8f ", genrand_real2());
00241 if (i%5==4) printf("\n");
00242 }
00243
00244 return 0;
00245 }
00246
00247 #endif