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 }