00001
00002 #ifndef RAND_NUM_GENERATOR_H
00003 #define RAND_NUM_GENERATOR_H
00004
00005 #include <iostream>
00006 using namespace std;
00007 #include <boost/shared_ptr.hpp>
00008 #include <boost/random.hpp>
00009 #include <boost/utility.hpp>
00010
00011 #include "utility.hpp"
00012
00018 class RandNumGenerator : boost::noncopyable {
00019 public:
00021 typedef boost::shared_ptr<RandNumGenerator> RandNumGeneratorPtr;
00022
00027 static inline RandNumGeneratorPtr create();
00028
00033 inline void setSeed(const t_uint seed);
00034
00042 inline int uniformInt(const int min, const int max);
00043
00048 inline double uniformZeroOne();
00049
00056 inline double uniformReal(const double min, const double max);
00057
00063 inline double exponential(const double lambda);
00064
00071 inline double normalDistribution(const double mean, const double sigma);
00072
00077 friend ostream& operator<< (ostream& s,
00078 const RandNumGenerator& randNumGenerator);
00079
00080 private:
00081
00085 typedef boost::lagged_fibonacci607 BaseGenerator;
00086
00088 static const t_uint m_DEFAULT_SEED;
00089
00092 t_uint m_seed;
00093
00095 BaseGenerator m_baseGenerator;
00096
00098 RandNumGenerator();
00099
00100 };
00101 typedef boost::shared_ptr<RandNumGenerator> RandNumGeneratorPtr;
00102
00104
00106
00107 inline RandNumGeneratorPtr RandNumGenerator::create()
00108 {
00109 RandNumGeneratorPtr rand(new RandNumGenerator());
00110 return rand;
00111 }
00112
00113 inline void RandNumGenerator::setSeed(t_uint seed)
00114 {
00115 m_seed = seed;
00116 m_baseGenerator.seed(m_seed);
00117 }
00118
00119 inline int RandNumGenerator::uniformInt(const int min, const int max)
00120 {
00121 boost::uniform_int<> uniformInt(min, max);
00122 boost::variate_generator<BaseGenerator&, boost::uniform_int<> >
00123 generator(m_baseGenerator, uniformInt);
00124 int randVal = generator();
00125 return randVal;
00126 }
00127
00128 inline double RandNumGenerator::uniformZeroOne()
00129 {
00130 boost::uniform_01<BaseGenerator> generator(m_baseGenerator);
00131 double randVal = generator();
00132 return randVal;
00133 }
00134
00135 inline double RandNumGenerator::uniformReal(const double min,
00136 const double max)
00137 {
00138 boost::uniform_real<> uniformReal(min, max);
00139 boost::variate_generator<BaseGenerator&, boost::uniform_real<> >
00140 generator(m_baseGenerator, uniformReal);
00141 double randVal = generator();
00142 return randVal;
00143 }
00144
00145 inline double RandNumGenerator::exponential(const double lambda)
00146 {
00147 boost::exponential_distribution<> exponentialDist(lambda);
00148 boost::variate_generator<BaseGenerator&,
00149 boost::exponential_distribution<> >
00150 generator(m_baseGenerator, exponentialDist);
00151 double randVal = generator();
00152 return randVal;
00153 }
00154
00155 inline double RandNumGenerator::normalDistribution(const double mean,
00156 const double sigma)
00157 {
00158 boost::normal_distribution<> normalDist(mean, sigma);
00159 boost::variate_generator<BaseGenerator&,
00160 boost::normal_distribution<> >
00161 generator(m_baseGenerator, normalDist);
00162 double randVal = generator();
00163 return randVal;
00164
00165 }
00166
00168
00170
00171 inline ostream& operator<< (ostream& s,
00172 const RandNumGenerator& randNumGenerator)
00173 {
00174 return s<< "RandNumGenerator state (pointer=" <<
00175 &randNumGenerator << ", seed=" << randNumGenerator.m_seed << ")" ;
00176 }
00177
00178 #endif // RAND_NUM_GENERATOR_H
00179