00001
00002 #include "random.h"
00003 #include "math.h"
00004
00005 bool ExtRandom::deviate_available = false;
00006
00007 double ExtRandom::second_deviate = 0;
00008
00009 double ExtRandom::uniformRandom()
00010 {
00011 double u;
00012 u = (double)rand() / (double)RAND_MAX;
00013 return u;
00014 }
00015
00016 double ExtRandom::gaussRandom(double mu, double sd)
00017 {
00018
00019 if (deviate_available) {
00020 deviate_available = false;
00021 return mu + second_deviate * sd;
00022 } else {
00023 double v1, v2, rsq;
00024 do {
00025 v1 = 2.0 * uniformRandom() - 1.0;
00026 v2 = 2.0 * uniformRandom() - 1.0;
00027 rsq = v1*v1 + v2*v2;
00028 } while (rsq >= 1.0 || rsq == 0.0);
00029 double fac = sqrt(-2.0*log(rsq)/rsq);
00030 second_deviate = v1 * fac;
00031 deviate_available = true;
00032 return mu + v2 * fac * sd;
00033 }
00034 }
00035
00036 double ExtRandom::expRandom(double lambda)
00037 {
00038
00039 double num;
00040 do
00041 num = uniformRandom();
00042 while (num == 0.0);
00043 return -log(num) / lambda;
00044 }
00045
00046 double ExtRandom::ComputeGauss(double mu, double sigma, double x)
00047 {
00048 double re;
00049 re = x - mu;
00050 re *= re;
00051 re = -re/(2*sigma*sigma);
00052 re = exp(re);
00053
00054 re = re/(sigma * sqrt(2*PI));
00055
00056 return re;
00057 }
00058
00059
00060 double ExtRandom::ComputeLnGauss(double mu, double sigma, double v1, double v2, double x)
00061 {
00062 double re;
00063
00064
00065 if ( x < v1 || x > v2 )
00066 {
00067 return -BigValue;
00068 }
00069
00070
00071
00072
00073 re = x - mu;
00074 re *=re;
00075 re = re / (2 * sigma * sigma);
00076
00077 re = -re;
00078
00079
00080
00081 return re;
00082 }
00083
00084 double ExtRandom::GaussianIntegral(double mu, double sigma, double v1, double v2)
00085 {
00086 double re = 0;
00087 double x;
00088 double delta;
00089 delta = (v2-v1)/INTEGRALSTEP;
00090 int i;
00091 for ( i = 0; i < INTEGRALSTEP; i++ )
00092 {
00093 x = v1 + (double)i * delta;
00094 re = re + ComputeGauss(mu, sigma,x) * delta;
00095 }
00096 return re;
00097 }
00098
00099 void ExtRandom::GaussianParaLearning(double &mu, double &sigma, double &v1, double &v2, vector<double> Tdata)
00100 {
00101 int NumOfTData = Tdata.size();
00102 int i;
00103 vector<double>::iterator fiter = Tdata.begin();
00104 v1 = Tdata[0];
00105 v2 = Tdata[0];
00106
00107 mu = 0;
00108 for ( i = 0; i < NumOfTData; i++ )
00109 {
00110 mu += *(fiter+i);
00111 if ( v1 > Tdata[i] )
00112 {
00113 v1 = Tdata[i];
00114 }
00115
00116 if ( v2 < Tdata[i] )
00117 {
00118 v2 = Tdata[i];
00119 }
00120 }
00121 mu /= NumOfTData;
00122
00123 sigma = 0;
00124 for ( i = 0; i < NumOfTData; i++ )
00125 {
00126 sigma += pow(*(fiter+i)-mu, 2);
00127 }
00128 sigma /= (double)(NumOfTData-1);
00129 sigma = sqrt(sigma);
00130 }