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