rand_num_generator.hpp

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 // Inline Functions
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 // Overloaded Operators
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 

Generated on Tue Dec 12 17:04:38 2006 for rfidsim by  doxygen 1.4.7