00001 00008 #ifndef DISTRIB_H 00009 #define DISTRIB_H 00010 00011 #include <math.h> 00012 00022 class Distrib 00023 { 00024 private: 00025 static unsigned long int seed_; 00026 static signed long int x_; 00027 static signed long int y_; 00028 static signed long int z_; 00029 static inline signed long int Trunc(double x) { 00030 return (x >=0) ? (int(floor(x))) : (int(ceil(x))); 00031 }; 00032 00033 protected: 00039 Distrib (void); 00045 double Pick(void); 00046 00047 public: 00048 virtual ~Distrib (void); 00049 00056 virtual double GetVal (void) = 0; 00064 static void InitRng (unsigned long int seed=0); 00065 }; 00066 00067 00071 class Constant : public Distrib { 00072 private: 00073 double val_; 00074 public: 00075 Constant(double value); 00079 double GetVal(void); 00080 }; 00081 00085 class Unif01 : public Distrib { 00086 public: 00087 Unif01(void); 00091 double GetVal(void); 00092 }; 00093 00097 class Uniform : public Distrib { 00098 private: 00099 double a_; 00100 double b_; 00101 public: 00102 Uniform(double a, double b); 00106 double GetVal(void); 00107 }; 00108 00109 00113 class Exponential : public Distrib { 00114 private: 00115 double mean_; 00116 public: 00117 Exponential (double m); 00121 double GetVal(void); 00122 }; 00123 00128 class Normal : public Distrib { 00129 private: 00130 double mean_; 00131 double sDev_; 00132 public: 00133 Normal (double m, double sDev); 00137 double GetVal(void); 00138 }; 00139 00143 class ErlangK: public Distrib { 00144 private: 00145 double k_; 00146 double mean_; 00147 public: 00148 ErlangK (unsigned int k, double m); 00152 double GetVal(void); 00153 }; 00154 00159 class Pareto: public Distrib { 00160 private: 00161 double scale_; 00162 double alpha_; 00163 public: 00164 Pareto (double scale, double alpha); 00168 double GetVal(void); 00169 }; 00170 00175 class HyperExponential: public Distrib { 00176 private: 00177 double mean_; 00178 double sDev_; 00179 double p_; 00180 public: 00181 HyperExponential(double m, double sDev); 00185 double GetVal(void); 00186 }; 00187 00188 00192 class DiscreteEmpirical: public Distrib { 00193 private: 00194 typedef struct { 00195 double Fx; 00196 double val; 00197 } valT_; 00198 valT_ *accumP_; 00199 int n_; 00200 public: 00206 DiscreteEmpirical (const double P[],const double V[], int n); 00207 virtual ~DiscreteEmpirical (void); 00208 double GetVal (void); 00209 }; 00210 00211 #endif 00212