RandomNumberGenerator.hpp
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 #ifndef RANDOMNUMBERGENERATORS_HPP_
00037 #define RANDOMNUMBERGENERATORS_HPP_
00038
00039 #include <sstream>
00040 #include <boost/shared_ptr.hpp>
00041 #include <boost/version.hpp>
00042
00043
00044 #if BOOST_VERSION < 105600
00045
00046 #include "Boost156NormalDistribution.hpp"
00047 #endif
00048
00049 #include <boost/random.hpp>
00050
00051 #include "ChasteSerialization.hpp"
00052 #include "SerializableSingleton.hpp"
00053 #include <boost/serialization/split_member.hpp>
00054
00059 class RandomNumberGenerator : public SerializableSingleton<RandomNumberGenerator>
00060 {
00061 private:
00063 boost::mt19937 mMersenneTwisterGenerator;
00064
00065
00066
00068 boost::variate_generator<boost::mt19937& , boost::uniform_real<> > mGenerateUnitReal;
00069
00071 #if BOOST_VERSION < 105600 //#2585
00072 boost::variate_generator<boost::mt19937& , boost::random::normal_distribution_v156<> > mGenerateStandardNormal;
00073 #else
00074 boost::variate_generator<boost::mt19937& , boost::normal_distribution<> > mGenerateStandardNormal;
00075 #endif
00076
00077 static RandomNumberGenerator* mpInstance;
00078
00079 friend class boost::serialization::access;
00089 template<class Archive>
00090 void save(Archive & archive, const unsigned int version) const
00091 {
00092 std::stringstream rng_internals;
00093 rng_internals << mMersenneTwisterGenerator;
00094 std::string rng_internals_string = rng_internals.str();
00095 archive & rng_internals_string;
00096
00097 std::stringstream normal_internals;
00098 #if BOOST_VERSION < 105600 //#2585
00099 const boost::random::normal_distribution_v156<>& r_normal_dist = mGenerateStandardNormal.distribution();
00100 #else
00101 const boost::normal_distribution<>& r_normal_dist = mGenerateStandardNormal.distribution();
00102 #endif
00103 normal_internals << r_normal_dist;
00104 std::string normal_internals_string = normal_internals.str();
00105 archive & normal_internals_string;
00106 }
00107
00117 template<class Archive>
00118 void load(Archive & archive, const unsigned int version)
00119 {
00120 std::string rng_internals_string;
00121 archive & rng_internals_string;
00122 std::stringstream rng_internals(rng_internals_string);
00123 rng_internals >> mMersenneTwisterGenerator;
00124
00125 std::string normal_internals_string;
00126 archive & normal_internals_string;
00127 std::stringstream normal_internals(normal_internals_string);
00128 normal_internals >> mGenerateStandardNormal.distribution();
00129 }
00130 BOOST_SERIALIZATION_SPLIT_MEMBER()
00131
00132 protected:
00133
00138 RandomNumberGenerator();
00139
00140 public:
00141
00147 double StandardNormalRandomDeviate();
00148
00156 double NormalRandomDeviate(double mean, double stdDev);
00157
00161 double ranf();
00162
00169 double GammaRandomDeviate(double shape, double scale);
00170
00176 double ExponentialRandomDeviate(double scale);
00177
00184 unsigned randMod(unsigned base);
00185
00193 template <class T>
00194 void Shuffle(std::vector<boost::shared_ptr<T> >& rValues)
00195 {
00196 unsigned num = rValues.size();
00197 if (num == 0)
00198 {
00199 return;
00200 }
00201 for (unsigned end=num-1; end>0; end--)
00202 {
00203
00204 unsigned k = RandomNumberGenerator::Instance()->randMod(end+1);
00205 boost::shared_ptr<T> temp = rValues[end];
00206 rValues[end] = rValues[k];
00207 rValues[k] = temp;
00208 }
00209 }
00210
00220 void Shuffle(unsigned num, std::vector<unsigned>& rValues);
00221
00226 static RandomNumberGenerator* Instance();
00227
00234 static void Destroy();
00235
00241 void Reseed(unsigned seed);
00242 };
00243
00244 #endif