home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include "utils.h"
-
- #define M1 259200
- #define IA1 7141
- #define IC1 54773
- #define RM1 (1.0/M1)
- #define M2 134456
- #define IA2 8121
- #define IC2 28411
- #define RM2 (1.0/M2)
- #define M3 243000
- #define IA3 4561
- #define IC3 51349
-
- double
- ran1 (idum)
- int *idum;
- {
- static long ix1, ix2, ix3;
- static double r[98];
- double temp;
- static int iff = 0;
- int j;
-
- if (*idum < 0 || iff == 0)
- {
- iff = 1;
- ix1 = (IC1 - (*idum)) % M1;
- ix1 = (IA1 * ix1 + IC1) % M1;
- ix2 = ix1 % M2;
- ix1 = (IA1 * ix1 + IC1) % M1;
- ix3 = ix1 % M3;
- for (j = 1; j <= 97; j++)
- {
- ix1 = (IA1 * ix1 + IC1) % M1;
- ix2 = (IA2 * ix2 + IC2) % M2;
- r[j] = (ix1 + ix2 * RM2) * RM1;
- }
- *idum = 1;
- }
- ix1 = (IA1 * ix1 + IC1) % M1;
- ix2 = (IA2 * ix2 + IC2) % M2;
- ix3 = (IA3 * ix3 + IC3) % M3;
- j = 1 + ((97 * ix3) / M3);
- if (j > 97 || j < 1)
- FatalError ("RAN1: This cannot happen.");
- temp = r[j];
- r[j] = (ix1 + ix2 * RM2) * RM1;
- return temp;
- }
-
- #undef M1
- #undef IA1
- #undef IC1
- #undef RM1
- #undef M2
- #undef IA2
- #undef IC2
- #undef RM2
- #undef M3
- #undef IA3
- #undef IC3
-