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
00039
00040
00041 #include <time.h>
00042 #include "stdinc.h"
00043
00044 #ifndef TOOLBOX
00045
00046
00047
00048
00049
00050
00051
00052
00053 static int randx = 0;
00054
00055
00056
00057 static int initial_seed = 0;
00058
00059
00060
00061 static int n_rand = 0;
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 int srandinter(int seed, int iter) {
00073
00074 if (seed == 0)
00075 seed = (int) time(NULL);
00076
00077
00078 initial_seed = abs(seed);
00079 n_rand = 0;
00080
00081 randx = -initial_seed;
00082
00083 for (int i = 0; i < iter; i++) randinter(0,1);
00084
00085 return initial_seed;
00086
00087 }
00088
00089
00090
00091 int get_initial_seed() {
00092
00093 return initial_seed;
00094 }
00095
00096
00097
00098 int get_rand_seed() {
00099
00100 return abs(randx);
00101 }
00102
00103
00104
00105 int get_current_seed() {
00106
00107 return abs(randx);
00108 }
00109
00110
00111
00112 int get_n_rand() {
00113
00114 return n_rand;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 #define MAXNUM 2147483647.0 // the maximum value which rand() can return
00126
00127 real randunit() {
00128
00129 if (randx < 0) randx *= -1;
00130 randx &= 0x7fffffff;
00131
00132 return (real)((randx = randx * 1103515245 + 12345) & 0x7fffffff)/MAXNUM;
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 #define IA 16807
00148 #define IM 2147483647
00149 #define AM (1.0/IM)
00150 #define IQ 127773
00151 #define IR 2836
00152 #define MASK 123459876
00153
00154 real ran0(int& idum)
00155 {
00156 int k;
00157 real ans;
00158
00159 if (idum < 0) idum *= -1;
00160
00161 idum ^= MASK;
00162 k = (idum)/IQ;
00163 idum = IA*(idum-k*IQ) - IR*k;
00164 if (idum < 0) idum += IM;
00165 ans = AM*(idum);
00166 idum ^= MASK;
00167
00168 return ans;
00169 }
00170
00171 #undef IA
00172 #undef IM
00173 #undef AM
00174 #undef IQ
00175 #undef IR
00176 #undef MASK
00177
00178 #define IA 16807
00179 #define IM 2147483647
00180 #define AM (1.0/IM)
00181 #define IQ 127773
00182 #define IR 2836
00183 #define NTAB 32
00184 #define NDIV (1+(IM-1)/NTAB)
00185 #define EPS 1.e-14
00186 #define RNMX (1.0-EPS)
00187
00188 real ran1(int& idum)
00189 {
00190 int j;
00191 int k;
00192 static int iy = 0;
00193 static int iv[NTAB];
00194 real temp;
00195
00196 if (idum <= 0 || !iy) {
00197 if (-(idum) < 1)
00198 idum = 1;
00199 else
00200 idum = -(idum);
00201 for (j = NTAB+7; j >= 0; j--) {
00202 k = (idum)/IQ;
00203 idum = IA*(idum-k*IQ) - IR*k;
00204 if (idum < 0) idum += IM;
00205 if (j < NTAB) iv[j] = idum;
00206 }
00207 iy = iv[0];
00208 }
00209
00210 k = (idum)/IQ;
00211 idum = IA*(idum-k*IQ) - IR*k;
00212 if (idum < 0) idum += IM;
00213
00214 j = iy/NDIV;
00215 iy = iv[j];
00216 iv[j] = idum;
00217
00218 if ((temp = AM*iy) > RNMX)
00219 return RNMX;
00220 else
00221 return temp;
00222 }
00223
00224 #undef IA
00225 #undef IM
00226 #undef AM
00227 #undef IQ
00228 #undef IR
00229 #undef NTAB
00230 #undef NDIV
00231 #undef EPS
00232 #undef RNMX
00233
00234 #define IM1 2147483563
00235 #define IM2 2147483399
00236 #define AM (1.0/IM1)
00237 #define IMM1 (IM1-1)
00238 #define IA1 40014
00239 #define IA2 40692
00240 #define IQ1 53668
00241 #define IQ2 52774
00242 #define IR1 12211
00243 #define IR2 3791
00244 #define NTAB 32
00245 #define NDIV (1+IMM1/NTAB)
00246 #define EPS 1.e-14
00247 #define RNMX (1.0-EPS)
00248
00249 real ran2(int& idum)
00250 {
00251 int j;
00252 int k;
00253 static int idum2 = 123456789;
00254 static int iy = 0;
00255 static int iv[NTAB];
00256 real temp;
00257
00258 if (idum <= 0) {
00259 if (-(idum) < 1)
00260 idum = 1;
00261 else
00262 idum = -(idum);
00263 idum2 = (idum);
00264
00265 for (j = NTAB+7; j >= 0; j--) {
00266 k = (idum)/IQ1;
00267 idum = IA1*(idum-k*IQ1) - k*IR1;
00268 if (idum < 0) idum += IM1;
00269 if (j < NTAB) iv[j] = idum;
00270 }
00271 iy = iv[0];
00272 }
00273 k = (idum)/IQ1;
00274 idum = IA1*(idum-k*IQ1) - k*IR1;
00275 if (idum < 0) idum += IM1;
00276
00277 k = idum2/IQ2;
00278 idum2 = IA2*(idum2-k*IQ2)-k*IR2;
00279 if (idum2 < 0) idum2 += IM2;
00280
00281 j = iy/NDIV;
00282 iy = iv[j] - idum2;
00283 iv[j] = idum;
00284 if (iy < 1) iy += IMM1;
00285
00286 if ((temp = AM*iy) > RNMX)
00287 return RNMX;
00288 else
00289 return temp;
00290 }
00291
00292 #undef IM1
00293 #undef IM2
00294 #undef AM
00295 #undef IMM1
00296 #undef IA1
00297 #undef IA2
00298 #undef IQ1
00299 #undef IQ2
00300 #undef IR1
00301 #undef IR2
00302 #undef NTAB
00303 #undef NDIV
00304 #undef EPS
00305 #undef RNMX
00306
00307
00308
00309
00310
00311
00312 real randinter(real a, real b) {
00313
00314 n_rand++;
00315
00316
00317
00318
00319
00320
00321
00322 return a + (b-a)*ran2(randx);
00323
00324 }
00325
00326
00327
00328
00329 #define BIG 10
00330
00331 real gausrand(real mean, real sdev)
00332 {
00333
00334
00335
00336 for(;;) {
00337 real x = randinter(-BIG, BIG);
00338 if (randinter(0,1) < exp(-0.5*x*x)) return mean + x*sdev;
00339 }
00340 }
00341
00342
00343
00344 #else
00345
00346
00347
00348
00349
00350
00351 main(int argc, char **argv) {
00352
00353 check_help();
00354 if (argc < 2)
00355 err_exit("randinter N [S] (for N throws of dice, from seed S)");
00356
00357 int seed;
00358 if (argc == 2)
00359 seed = srandinter(0);
00360 else
00361 seed = srandinter(atoi(argv[2]));
00362
00363 cout.precision(8);
00364 int i;
00365 for (i = 1; i <= atoi(argv[1]); i++) {
00366 real x = randinter(0,1);
00367 cout << randinter(0, 1) << " ";
00368 if (i%5 == 0) cout << endl;
00369 }
00370 if ((i-1)%5 != 0) cout << endl;
00371 }
00372 #endif