121 (void) fprintf(
STDOUT,
"\n\n/* *** SIMPLE EQUILIKELY DISTRIBUTED POSITIVE INTEGER NUMBER ");
122 (void) fprintf(
STDOUT,
"PSEUDO-RANDOM GENERATOR (MATSUMOTO & NISHIMURA IMPROVED LCG) **** */\n\n");
123 (void) fprintf(
STDOUT,
"I_TYPE napa_rand_integer(I_TYPE range) { %*s /* Output in [0, range] */\n", 57,
" ");
124 (void) fprintf(
STDOUT,
" unsigned long ulrnd;\n");
125 (void) fprintf(
STDOUT,
" static unsigned long j = 1UL;\n");
126 (void) fprintf(
STDOUT,
" ulrnd = ((unsigned long) rand()) & 0XFFFFFFFFUL;\n");
127 (void) fprintf(
STDOUT,
" ulrnd = j + (1812433253UL * (ulrnd^(ulrnd >> 30)));\n");
128 (void) fprintf(
STDOUT,
" j++;\n");
129 (void) fprintf(
STDOUT,
" return ((I_TYPE) (ulrnd & 0XFFFFFFFFUL)) %% (1LL + ABS(range));\n");
130 (void) fprintf(
STDOUT,
"}\n");
131 (void) fprintf(
STDOUT,
"\n\n/* *** SEED RANDOMIZER (MATSUMOTO & NISHIMURA IMPROVED LCG) %s */\n\n",
multiple(
'*', 66L));
132 (void) fprintf(
STDOUT,
"#if !defined(EXTERNAL_PSEUDO_RANDOM_NUMBER_GENERATOR)\n\n");
133 (void) fprintf(
STDOUT,
"I_TYPE napa_default_root(I_TYPE seed) {\n");
134 (void) fprintf(
STDOUT,
" unsigned long ulrnd;\n");
135 (void) fprintf(
STDOUT,
" static unsigned long j = 1UL;\n");
136 (void) fprintf(
STDOUT,
" ulrnd = ((unsigned long) seed) & 0XFFFFFFFFUL;\n");
137 (void) fprintf(
STDOUT,
" ulrnd = j + (1812433253UL * (ulrnd^(ulrnd >> 30)));\n");
138 (void) fprintf(
STDOUT,
" j++;\n");
139 (void) fprintf(
STDOUT,
" return (I_TYPE) (ulrnd & 0XFFFFFFFFUL);\n");
140 (void) fprintf(
STDOUT,
"}\n\n");
141 (void) fprintf(
STDOUT,
"#endif\n\n");
149 (void) fprintf(
STDOUT,
"\n/* *** PSEUDO-RANDOM NUMBER GENERATOR (MERSENNE TWISTER MT19937-64) %s */\n",
multiple(
'*', 59L));
150 (void) fprintf(
STDOUT,
"/* *** Its period is 2^19937-1, which is approximately equal to 10^6002 %50s **** */\n",
" ");
151 (void) fprintf(
STDOUT,
"/* *** Source: Takuji Nishimura and Makoto Matsumoto, version 2004/9/29 %50s **** */\n",
" ");
153 (void) fprintf(
STDOUT,
"#if !defined(EXTERNAL_PSEUDO_RANDOM_NUMBER_GENERATOR)\n\n");
155 (void) fprintf(
STDOUT,
"unsigned long long napa_random_mta[312];\n");
156 (void) fprintf(
STDOUT,
"int napa_random_mti = 0;\n\n");
158 (void) fprintf(
STDOUT,
"I_TYPE napa_default_seed(I_TYPE seed) {\n");
159 (void) fprintf(
STDOUT,
" time_t tsys;\n");
160 (void) fprintf(
STDOUT,
" if ( 0LL == seed ) {\n");
161 (void) fprintf(
STDOUT,
" tsys = time((time_t*) NULL);\n");
162 (void) fprintf(
STDOUT,
" seed = ((I_TYPE) tsys) / 2LL;\n");
163 (void) fprintf(
STDOUT,
" } else {\n");
164 (void) fprintf(
STDOUT,
" seed = ABS(seed);\n");
165 (void) fprintf(
STDOUT,
" }\n");
166 (void) fprintf(
STDOUT,
" napa_random_mta[0] = (unsigned long long) napa_root(seed);\n");
167 (void) fprintf(
STDOUT,
" for (napa_random_mti = 1; napa_random_mti < 312; napa_random_mti++) {\n");
168 (void) fprintf(
STDOUT,
" napa_random_mta[napa_random_mti] = napa_random_mta[napa_random_mti-1];\n");
169 (void) fprintf(
STDOUT,
" napa_random_mta[napa_random_mti] ^= napa_random_mta[napa_random_mti-1] >> 62;\n");
170 (void) fprintf(
STDOUT,
" napa_random_mta[napa_random_mti] *= 6364136223846793005ULL;\n");
171 (void) fprintf(
STDOUT,
" napa_random_mta[napa_random_mti] += napa_random_mti;\n");
172 (void) fprintf(
STDOUT,
" }\n");
173 (void) fprintf(
STDOUT,
" return seed;\n");
174 (void) fprintf(
STDOUT,
"}\n\n");
176 (void) fprintf(
STDOUT,
"I_TYPE napa_default_rand(void) {\n");
177 (void) fprintf(
STDOUT,
" int i;\n");
178 (void) fprintf(
STDOUT,
" unsigned long long x;\n");
179 (void) fprintf(
STDOUT,
" static const unsigned long long mag01[2] = {0ULL, 0XB5026F5AA96619E9ULL};\n");
180 (void) fprintf(
STDOUT,
" if ( 312 <= napa_random_mti ) {\n");
181 (void) fprintf(
STDOUT,
" for (i = 0; i < 156; i++) {\n");
182 (void) fprintf(
STDOUT,
" x = (napa_random_mta[ i] & 0XFFFFFFFF80000000ULL) | (napa_random_mta[i+1] & 0X7FFFFFFFULL);\n");
183 (void) fprintf(
STDOUT,
" napa_random_mta[i] = napa_random_mta[i+156] ^ (x>>1) ^ mag01[(int) (x&1ULL)];\n");
184 (void) fprintf(
STDOUT,
" }\n");
185 (void) fprintf(
STDOUT,
" for (i = 156; i < 311; i++) {\n");
186 (void) fprintf(
STDOUT,
" x = (napa_random_mta[ i] & 0XFFFFFFFF80000000ULL) | (napa_random_mta[i+1] & 0X7FFFFFFFULL);\n");
187 (void) fprintf(
STDOUT,
" napa_random_mta[i] = napa_random_mta[i-156] ^ (x>>1) ^ mag01[(int) (x&1ULL)];\n");
188 (void) fprintf(
STDOUT,
" }\n");
189 (void) fprintf(
STDOUT,
" x = (napa_random_mta[311] & 0XFFFFFFFF80000000ULL) | (napa_random_mta[ 0] & 0X7FFFFFFFULL);\n");
190 (void) fprintf(
STDOUT,
" napa_random_mta[311] = napa_random_mta[ 155] ^ (x>>1) ^ mag01[(int) (x&1ULL)];\n");
191 (void) fprintf(
STDOUT,
" napa_random_mti = 0;\n");
192 (void) fprintf(
STDOUT,
" }\n");
193 (void) fprintf(
STDOUT,
" x = napa_random_mta[napa_random_mti++];\n");
194 (void) fprintf(
STDOUT,
" x ^= (x >> 29) & 0X5555555555555555ULL;\n");
195 (void) fprintf(
STDOUT,
" x ^= (x << 17) & 0X71D67FFFEDA60000ULL;\n");
196 (void) fprintf(
STDOUT,
" x ^= (x << 37) & 0XFFF7EEE000000000ULL;\n");
197 (void) fprintf(
STDOUT,
" x ^= (x >> 43);\n");
198 (void) fprintf(
STDOUT,
" return (I_TYPE) (x >> 1);\n");
199 (void) fprintf(
STDOUT,
"}\n\n");
200 (void) fprintf(
STDOUT,
"#endif\n");
#define NAPA_COMPILER_VERSION
char * multiple(char c, long n)
void random_functions(void)
void randomizer_functions(void)