StdAir Logo  0.43.0
C++ Standard Airline IT Library
RandomGeneration.cpp
Go to the documentation of this file.
00001 // //////////////////////////////////////////////////////////////////////
00002 // Import section
00003 // //////////////////////////////////////////////////////////////////////
00004 // STL
00005 #include <cassert>
00006 // Boost
00007 #include <boost/version.hpp>
00008 #if BOOST_VERSION >= 103500
00009 #include <boost/math/distributions/normal.hpp>
00010 #endif // BOOST_VERSION >= 103500
00011 // StdAir
00012 #include <stdair/basic/RandomGeneration.hpp>
00013 
00014 namespace stdair {
00015   
00021   // //////////////////////////////////////////////////////////////////////
00022   RandomGeneration::RandomGeneration() : _generator (1) {
00023   }
00024 
00025   // //////////////////////////////////////////////////////////////////////
00026   RandomGeneration::RandomGeneration (const RandomSeed_T& iSeed)
00027     : _generator (iSeed) {
00028   }
00029 
00030   // //////////////////////////////////////////////////////////////////////
00031   RandomGeneration::RandomGeneration (const RandomGeneration& iRandomGeneration)
00032     : _generator (iRandomGeneration._generator) {
00033   }
00034 
00035   // //////////////////////////////////////////////////////////////////////
00036   RandomGeneration::~RandomGeneration() {
00037   }
00038 
00039   // //////////////////////////////////////////////////////////////////////
00040   void RandomGeneration::init (const RandomSeed_T& iSeed) {
00041     _generator.seed (iSeed);
00042   }
00043 
00044   // //////////////////////////////////////////////////////////////////////
00045   const std::string RandomGeneration::describe() const {
00046     std::ostringstream oStr;
00047     oStr << _generator;
00048     return oStr.str();
00049   }
00050 
00051   // //////////////////////////////////////////////////////////////////////
00052   RealNumber_T RandomGeneration::generateUniform01() {
00053     UniformGenerator_T lGenerator (_generator, boost::uniform_real<>(0, 1));
00054     return lGenerator();
00055   }
00056   
00057   // //////////////////////////////////////////////////////////////////////
00058   RealNumber_T RandomGeneration::generateUniform(const RealNumber_T& iMinValue,
00059                                                  const RealNumber_T& iMaxValue) {
00060     const Probability_T lVariateUnif01 = generateUniform01();
00061     const RealNumber_T lVariateUnif =
00062       iMinValue + lVariateUnif01 * (iMaxValue - iMinValue);
00063     return lVariateUnif;
00064   }
00065 
00066   // //////////////////////////////////////////////////////////////////////
00067   RealNumber_T RandomGeneration::generateNormal (const RealNumber_T& mu,
00068                                                  const RealNumber_T& sigma) {
00069     
00070 #if BOOST_VERSION >= 103500
00071     const Probability_T lVariateUnif = generateUniform01();
00072     const boost::math::normal lNormal (mu, sigma);
00073     const RealNumber_T lRealNumberOfRequestsToBeGenerated =
00074       boost::math::quantile (lNormal, lVariateUnif);
00075 #else // BOOST_VERSION >= 103500
00076     // TODO: rely on GSL when Boost version smaller than 1.35
00077     const RealNumber_T lRealNumberOfRequestsToBeGenerated = 0.0;
00078 #endif // BOOST_VERSION >= 103500
00079 
00080     return lRealNumberOfRequestsToBeGenerated;
00081         
00082   }
00083 
00084   // //////////////////////////////////////////////////////////////////////
00085   RealNumber_T RandomGeneration::generateExponential (const RealNumber_T& lambda) {
00090     ExponentialDistribution_T lExponentialDistribution (lambda);
00091     
00093     ExponentialGenerator_T lExponentialDistributionGenerator (_generator,
00094                                                               lExponentialDistribution); 
00095 
00096     // Generate a random variate, expressed in (fractional) day
00097     const RealNumber_T lExponentialVariateInDays =
00098       lExponentialDistributionGenerator();
00099 
00100     return lExponentialVariateInDays;
00101   }
00102 
00103 }