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 #ifndef RANDOMNUMBERGENERATORS_HPP_
00031 #define RANDOMNUMBERGENERATORS_HPP_
00032 #include <cmath>
00033 #include <ctime>
00034 #include <stdlib.h>
00035 #include <iostream>
00036 #include <vector>
00037
00038 #include <boost/serialization/access.hpp>
00039 #include <boost/serialization/split_member.hpp>
00040
00041 class RandomNumberGenerator
00042 {
00043 public:
00044 double StandardNormalRandomDeviate(void);
00045 double NormalRandomDeviate(double mean, double sd);
00046 double ranf(void);
00047 unsigned randMod(unsigned base);
00048 void Shuffle(unsigned num, std::vector<unsigned>& rValues);
00049
00050
00051 static RandomNumberGenerator* Instance();
00052 static void Destroy();
00053 void Reseed(int seed)
00054 {
00055 mSeed = seed;
00056 srandom(seed);
00057 mTimesCalled = 0;
00058 }
00059 protected:
00063 RandomNumberGenerator()
00064 {
00065 mSeed = 0;
00066 mTimesCalled = 0;
00067 srandom(0);
00068 }
00069
00070 private:
00071 int mSeed;
00072 unsigned mTimesCalled;
00073
00074 static RandomNumberGenerator* mpInstance;
00075
00076 friend class boost::serialization::access;
00083 template<class Archive>
00084 void save(Archive & archive, const unsigned int version) const
00085 {
00086
00087 archive & mSeed;
00088 archive & mTimesCalled;
00089 }
00090 template<class Archive>
00091 void load(Archive & archive, const unsigned int version)
00092 {
00093 archive & mSeed;
00094 archive & mTimesCalled;
00095
00096 srandom(mSeed);
00097
00098
00099
00100
00101
00102 for (unsigned i=0; i<mTimesCalled; i++)
00103 {
00104 random();
00105 }
00106 }
00107 BOOST_SERIALIZATION_SPLIT_MEMBER()
00108
00109 };
00110 #endif