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/random.hpp>
00042
00043 #include "ChasteSerialization.hpp"
00044 #include "SerializableSingleton.hpp"
00045 #include <boost/serialization/split_member.hpp>
00046
00051 class RandomNumberGenerator : public SerializableSingleton<RandomNumberGenerator>
00052 {
00053 private:
00055 boost::mt19937 mMersenneTwisterGenerator;
00056
00058 boost::variate_generator<boost::mt19937& , boost::uniform_real<> > mGenerateUnitReal;
00059
00061 boost::variate_generator<boost::mt19937& , boost::normal_distribution<> > mGenerateStandardNormal;
00062
00064 static RandomNumberGenerator* mpInstance;
00065
00066 friend class boost::serialization::access;
00076 template<class Archive>
00077 void save(Archive & archive, const unsigned int version) const
00078 {
00079 std::stringstream rng_internals;
00080 rng_internals << mMersenneTwisterGenerator;
00081 std::string rng_internals_string = rng_internals.str();
00082 archive & rng_internals_string;
00083
00084 std::stringstream normal_internals;
00085 const boost::normal_distribution<>& r_normal_dist = mGenerateStandardNormal.distribution();
00086 normal_internals << r_normal_dist;
00087 std::string normal_internals_string = normal_internals.str();
00088 archive & normal_internals_string;
00089 }
00090
00100 template<class Archive>
00101 void load(Archive & archive, const unsigned int version)
00102 {
00103 std::string rng_internals_string;
00104 archive & rng_internals_string;
00105 std::stringstream rng_internals(rng_internals_string);
00106 rng_internals >> mMersenneTwisterGenerator;
00107
00108 std::string normal_internals_string;
00109 archive & normal_internals_string;
00110 std::stringstream normal_internals(normal_internals_string);
00111 normal_internals >> mGenerateStandardNormal.distribution();
00112 }
00113 BOOST_SERIALIZATION_SPLIT_MEMBER()
00114
00115 protected:
00116
00121 RandomNumberGenerator();
00122
00123 public:
00124
00130 double StandardNormalRandomDeviate();
00131
00139 double NormalRandomDeviate(double mean, double stdDev);
00140
00144 double ranf();
00145
00152 double GammaRandomDeviate(double shape, double scale);
00153
00159 double ExponentialRandomDeviate(double scale);
00160
00167 unsigned randMod(unsigned base);
00168
00176 template <class T>
00177 void Shuffle(std::vector<boost::shared_ptr<T> >& rValues)
00178 {
00179 unsigned num = rValues.size();
00180 if (num == 0)
00181 {
00182 return;
00183 }
00184 for (unsigned end=num-1; end>0; end--)
00185 {
00186
00187 unsigned k = RandomNumberGenerator::Instance()->randMod(end+1);
00188 boost::shared_ptr<T> temp = rValues[end];
00189 rValues[end] = rValues[k];
00190 rValues[k] = temp;
00191 }
00192 }
00193
00203 void Shuffle(unsigned num, std::vector<unsigned>& rValues);
00204
00209 static RandomNumberGenerator* Instance();
00210
00217 static void Destroy();
00218
00224 void Reseed(unsigned seed);
00225 };
00226
00227 #endif