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