improla_rng.h
00001 #include <math.h>
00002 #define IM1 2147483563
00003 #define IM2 2147483399
00004 #define AM (1.0/IM1)
00005 #define IMM1 (IM1-1)
00006 #define IA1 40014
00007 #define IA2 40692
00008 #define IQ1 53668
00009 #define IQ2 52774
00010 #define IR1 12211
00011 #define IR2 3791
00012 #define NTAB 32
00013 #define NDIV (1+IMM1/NTAB)
00014 #define EPS 1.2e-7
00015 #define RNMX (1.0-EPS)
00016
00017 float ran2(long *idum)
00018 {
00019 int j;
00020 long k;
00021 static long idum2=123456789;
00022 static long iy=0;
00023 static long iv[NTAB];
00024 float temp;
00025
00026 if (*idum <= 0)
00027 {
00028 if (-(*idum) < 1)
00029 *idum=1;
00030 else
00031 *idum = -(*idum);
00032
00033 idum2=(*idum);
00034
00035 for (j=NTAB+7;j>=0;j--)
00036 {
00037 k=(*idum)/IQ1;
00038 *idum=IA1*(*idum-k*IQ1)-k*IR1;
00039 if (*idum < 0)
00040 *idum += IM1;
00041 if (j < NTAB)
00042 iv[j] = *idum;
00043 }
00044
00045 iy=iv[0];
00046 }
00047
00048 k=(*idum)/IQ1;
00049 *idum=IA1*(*idum-k*IQ1)-k*IR1;
00050
00051 if (*idum < 0)
00052 *idum += IM1;
00053
00054 k=idum2/IQ2;
00055 idum2=IA2*(idum2-k*IQ2)-k*IR2;
00056
00057 if (idum2 < 0)
00058 idum2 += IM2;
00059
00060 j=iy/NDIV;
00061 iy=iv[j]-idum2;
00062 iv[j] = *idum;
00063
00064 if (iy < 1)
00065 iy += IMM1;
00066 if ((temp=AM*iy) > RNMX)
00067 return RNMX;
00068 else
00069 return temp;
00070 }
00071
00072
00073 float gasdev(long *idum)
00074 {
00075 float ran1(long *idum);
00076 static int iset=0;
00077 static float gset;
00078 float fac,rsq,v1,v2;
00079
00080 if (*idum < 0) iset=0;
00081
00082 if (iset == 0)
00083 {
00084 do
00085 {
00086 v1=2.0*ran1(idum)-1.0;
00087 v2=2.0*ran1(idum)-1.0;
00088 rsq=v1*v1+v2*v2;
00089 }
00090 while (rsq >= 1.0 || rsq == 0.0);
00091
00092 fac=sqrt(-2.0*log(rsq)/rsq);
00093
00094 gset=v1*fac;
00095 iset=1;
00096
00097 return v2*fac;
00098 }
00099 else
00100 {
00101 iset=0;
00102 return gset;
00103 }
00104 }
Generated on Mon Nov 22 11:12:41 2004 for ImprolaLib by
1.3.7