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 }