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