NAPA Compiler V4.50
Author: Yves Leduc, yves.leduc.be@gmail.com
Loading...
Searching...
No Matches
C:/Simulate/Napados/Source/rg.c File Reference
#include "./napa.h"
#include "./proto.h"

Go to the source code of this file.

Macros

#define EXTERN   extern

Functions

void randomizer_functions (void)
void random_functions (void)

Macro Definition Documentation

◆ EXTERN

#define EXTERN   extern

Definition at line 4 of file rg.c.

Function Documentation

◆ random_functions()

void random_functions ( void )

Definition at line 148 of file rg.c.

148 {
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", " ");
152 (void) fprintf(STDOUT, "/* *** Sligthly modified to fit NAPA %6s %72s **** */\n\n", NAPA_COMPILER_VERSION, " ");
153 (void) fprintf(STDOUT, "#if !defined(EXTERNAL_PSEUDO_RANDOM_NUMBER_GENERATOR)\n\n");
154
155 (void) fprintf(STDOUT, "unsigned long long napa_random_mta[312];\n");
156 (void) fprintf(STDOUT, "int napa_random_mti = 0;\n\n");
157
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");
175
176 (void) fprintf(STDOUT, "I_TYPE napa_default_rand(void) {\n"); /* generates on [0, 2^63-1]-interval */
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"); /* unsigned long long to positive signed long long */
199 (void) fprintf(STDOUT, "}\n\n");
200 (void) fprintf(STDOUT, "#endif\n");
201 return;
202}
#define NAPA_COMPILER_VERSION
Definition napa.h:30
#define STDOUT
Definition napa.h:104
char * multiple(char c, long n)
Definition tk.c:1801

References multiple(), NAPA_COMPILER_VERSION, and STDOUT.

Referenced by main().

◆ randomizer_functions()

void randomizer_functions ( void )

Definition at line 120 of file rg.c.

120 {
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");
142 return;
143}

References multiple(), and STDOUT.

Referenced by main().