00001
00009 #include "SimpleRandomNumberGenerator.h"
00010 #include <stdlib.h>
00011 #include <math.h>
00012
00013
00014 double SimpleRandomNumberGenerator::uniform_rand(long *idum)
00015
00016
00024
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