RandomNumberGenerator.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "Exception.hpp"
00037 #include "RandomNumberGenerator.hpp"
00038
00039 RandomNumberGenerator* RandomNumberGenerator::mpInstance = NULL;
00040
00041 RandomNumberGenerator::RandomNumberGenerator()
00042 : mMersenneTwisterGenerator(0u),
00043 mGenerateUnitReal(mMersenneTwisterGenerator, boost::uniform_real<>()),
00044 mGenerateStandardNormal(mMersenneTwisterGenerator, boost::normal_distribution<>(0.0, 1.0))
00045 {
00046 assert(mpInstance == NULL);
00047 }
00048
00049 RandomNumberGenerator* RandomNumberGenerator::Instance()
00050 {
00051 if (mpInstance == NULL)
00052 {
00053 mpInstance = new RandomNumberGenerator();
00054 }
00055 return mpInstance;
00056 }
00057
00058 void RandomNumberGenerator::Destroy()
00059 {
00060 if (mpInstance)
00061 {
00062 delete mpInstance;
00063 mpInstance = NULL;
00064 }
00065 }
00066
00067 unsigned RandomNumberGenerator::randMod(unsigned base)
00068 {
00069 assert(base > 0u);
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 #if BOOST_VERSION < 103700
00082 unsigned base_range =(mMersenneTwisterGenerator.max)() - (mMersenneTwisterGenerator.min)();
00083 unsigned val = mMersenneTwisterGenerator() - (mMersenneTwisterGenerator.min)();
00084 #else
00085
00086
00087 unsigned base_range =
00088 boost::random::detail::subtract<unsigned>()((mMersenneTwisterGenerator.max)(), (mMersenneTwisterGenerator.min)());
00089 unsigned val =
00090 boost::random::detail::subtract<unsigned>()(mMersenneTwisterGenerator(), (mMersenneTwisterGenerator.min)());
00091 #endif
00092
00093 if (base - 1u >= base_range)
00094 {
00095
00096
00097 NEVER_REACHED;
00098
00099 }
00100 else
00101 {
00102 return (val % base);
00103 }
00104 }
00105
00106 double RandomNumberGenerator::ranf()
00107 {
00108 return mGenerateUnitReal();
00109 }
00110
00111 double RandomNumberGenerator::StandardNormalRandomDeviate()
00112 {
00113 return mGenerateStandardNormal();
00114 }
00115
00116 double RandomNumberGenerator::NormalRandomDeviate(double mean, double stdDev)
00117 {
00118 return stdDev * StandardNormalRandomDeviate() + mean;
00119 }
00120
00121 double RandomNumberGenerator::GammaRandomDeviate(double shape, double scale)
00122 {
00123 boost::gamma_distribution<> gd(shape);
00124 boost::variate_generator<boost::mt19937& , boost::gamma_distribution<> > var_gamma(mMersenneTwisterGenerator, gd);
00125
00126 return scale*var_gamma();
00127 }
00128
00129 double RandomNumberGenerator::ExponentialRandomDeviate(double scale)
00130 {
00131
00132 boost::exponential_distribution<> ed(scale);
00133
00134
00135 boost::variate_generator<boost::mt19937& , boost::exponential_distribution<> > var_exponential(mMersenneTwisterGenerator, ed);
00136
00137
00138 return var_exponential();
00139 }
00140
00141 void RandomNumberGenerator::Reseed(unsigned seed)
00142 {
00143 mMersenneTwisterGenerator.seed(seed);
00144 }
00145
00146 void RandomNumberGenerator::Shuffle(unsigned num, std::vector<unsigned>& rValues)
00147 {
00148 rValues.resize(num);
00149 for (unsigned i=0; i<num; i++)
00150 {
00151 rValues[i] = i;
00152 }
00153
00154 for (unsigned end=num-1; end>0; end--)
00155 {
00156
00157 unsigned k = RandomNumberGenerator::Instance()->randMod(end+1);
00158 unsigned temp = rValues[end];
00159 rValues[end] = rValues[k];
00160 rValues[k] = temp;
00161 }
00162 }