#define IA 16807 #define IM 2147483647 #define AM (1.0/IM) #define IQ 127773 #define IR 2836 #define NTAB 32 #define NDIV (1+(IM-1)/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) float ran1(long *idum) { int j; long k; static long iy=0; static long iv[NTAB]; float temp; if (*idum <=0 || !iy) { if (-(*idum) < 1) *idum=1; else *idum = -(*idum); for (j=NTAB+7;j>=0;j--) { k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if(*idum<0) *idum += IM; if (j < NTAB) iv[j] = *idum; } iy=iv[0]; } k=(*idum)/IQ; *idum=IA*(*idum-k*IQ)-IR*k; if (*idum <0 ) * idum += IM; j=iy/NDIV; iy=iv[j]; iv[j]= *idum; if ((temp=AM*iy) >RNMX) return RNMX; else return temp; } /***************************************************************************** Function: rannorm() Description: Generates a normal random variate with mean 0 and var 1 Parameters: long * idnum (the seed) Return: float *****************************************************************************/ float rannorm(long * idnum) { int n; float value; value = -6; for (n=0;n<12 ;n++ ) { value += ran1(idnum); } return value; }