SimpleRandomNumberGenerator.cpp

Go to the documentation of this file.
00001 
00009 #include "SimpleRandomNumberGenerator.h"
00010 #include <stdlib.h>
00011 #include <math.h>
00012 
00013 /* uniform random number generator */
00014 double SimpleRandomNumberGenerator::uniform_rand(long *idum)
00015 
00016 
00024 /* (C) Copr. 1986-92 Numerical Recipes Software )'). */
00025 {
00026 
00027 #define IM1 2147483563
00028 #define IM2 2147483399
00029 #define AM (1.0/IM1)
00030 #define IMM1 (IM1-1)
00031 #define IA1 40014
00032 #define IA2 40692
00033 #define IQ1 53668
00034 #define IQ2 52774
00035 #define IR1 12211
00036 #define IR2 3791
00037 #define NDIV (1+IMM1/NTAB)
00038 #define EPS 1.2e-7
00039 #define NTAB 32
00040 #define RNMX (1.0-EPS)
00041 
00042 
00043     int j;
00044     long k;
00045     double temp;
00046 
00047     if (*idum <= 0) {
00048         if (-(*idum) < 1) *idum=1;
00049         else *idum = -(*idum);
00050         idum2=(*idum);
00051         for (j=NTAB+7;j>=0;j--) {
00052             k=(*idum)/IQ1;
00053             *idum=IA1*(*idum-k*IQ1)-k*IR1;
00054             if (*idum < 0) *idum += IM1;
00055             if (j < NTAB) iv[j] = *idum;
00056         }
00057         iy=iv[0];
00058     }
00059     k=(*idum)/IQ1;
00060     *idum=IA1*(*idum-k*IQ1)-k*IR1;
00061     if (*idum < 0) *idum += IM1;
00062     k=idum2/IQ2;
00063     idum2=IA2*(idum2-k*IQ2)-k*IR2;
00064     if (idum2 < 0) idum2 += IM2;
00065     j=iy/NDIV;
00066     iy=iv[j]-idum2;
00067     iv[j] = *idum;
00068     if (iy < 1) iy += IMM1;
00069     if ( (temp=AM*iy) > RNMX) return RNMX;
00070     else return temp;
00071 
00072 #undef IM1
00073 #undef IM2
00074 #undef AM
00075 #undef IMM1
00076 #undef IA1
00077 #undef IA2
00078 #undef IQ1
00079 #undef IQ2
00080 #undef IR1
00081 #undef IR2
00082 #undef NTAB
00083 #undef NDIV
00084 #undef EPS
00085 #undef RNMX
00086 #undef NTAB
00087 
00088 }
00089 
00090 void SimpleRandomNumberGenerator::seed(long idum)
00092 {
00093     IDUM = -labs(idum);
00094     uniform_rand(&IDUM);
00095 }
00096 
00097 double SimpleRandomNumberGenerator::uniformRand(void)
00099 {
00100     return uniform_rand(&IDUM);
00101 }
00102 
00103 double SimpleRandomNumberGenerator::normalRand(void)
00107 {
00108     double fac,rsq,v1,v2;
00109 
00110     if  (iset == 0) {
00111         do {
00112             v1=2.0*uniformRand()-1.0;
00113             v2=2.0*uniformRand()-1.0;
00114             rsq=v1*v1+v2*v2;
00115         } while (rsq >= 1.0 || rsq == 0.0);
00116         fac=sqrt(-2.0*log(rsq)/rsq);
00117         gset=v1*fac;
00118         iset=1;
00119         return v2*fac;
00120     } else {
00121         iset=0;
00122         return gset;
00123     }
00124 }
00125 

Generated on Wed Jul 9 16:34:39 2008 for PCSIM by  doxygen 1.5.5