00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __adevs_rand_h_
00021 #define __adevs_rand_h_
00022 #include "adevs.h"
00023 #include <cstdlib>
00024
00025 namespace adevs
00026 {
00027
00028 typedef enum
00029 {
00030 NDURATION,
00031 NCOUNT,EMPTY,
00032 NDELAY,
00033 ADDTOQ,
00034 EMPTYQ,
00035 HNCLMS,
00036 HMODE,
00037 PROBVAL,
00038 ERRUNIFORM,
00039 ERRNORMAL,
00040 ERRLOGNORM,
00041 ERRTRIANG,
00042 ERRGAMMA,
00043 ERRBETA,
00044 ERREXPONENT,
00045 ERRERLANG,
00046 ERRHYPGEO,
00047 NULLEV,
00048 NOHISTO,
00049 INITERR,
00050 AMODE,
00051 HFORM,
00052 ERRFILE,
00053 SAMPLE,
00054 FRACTION,
00055 LEVEL,
00056 SCAN,
00057 SUPPRESS,
00058 SEED
00059 } errorType;
00060
00065 class random_seq
00066 {
00067 public:
00069 virtual void set_seed(unsigned long seed) = 0;
00071 virtual double next_dbl() = 0;
00073 virtual random_seq* copy() const = 0;
00074 virtual unsigned long next_long() = 0;
00076 virtual ~random_seq(){}
00077 };
00078
00085 class mtrand: public random_seq
00086 {
00087 public:
00089 mtrand(unsigned long seed = 1);
00091 mtrand(const unsigned long* seed_array);
00093 mtrand(const mtrand& src);
00095 const mtrand& operator=(const mtrand& src);
00097 void set_seed(unsigned long seed);
00099 random_seq* copy() const;
00101 unsigned long next_long();
00103 double next_dbl();
00105 ~mtrand ();
00106 private:
00107
00108 void sgenrand(unsigned long);
00109 void lsgenrand(const unsigned long*);
00110 unsigned long genrand();
00111
00112 unsigned long* mt;
00113 int mti;
00114 unsigned long init_seed;
00115 };
00116
00124 class crand: public random_seq
00125 {
00126 public:
00128 crand(){}
00130 crand(unsigned long seed) { srand (seed); }
00132 void set_seed(unsigned long seed) { srand (seed); }
00134 double next_dbl() { return (double)rand()/(double)RAND_MAX; }
00136 unsigned long next_long() { return (unsigned long)rand(); }
00137
00138 random_seq* copy() const { return new crand (); }
00140 ~crand(){}
00141 };
00142
00148 class rv
00149 {
00150 public:
00152 rv (unsigned long seed = 1);
00157 rv(random_seq* rand);
00159 rv(const rv& src);
00161 const rv& operator=(const rv& src);
00163 void set_seed(unsigned long seed);
00165 unsigned long next_long();
00167 double triangular(double a, double b, double c);
00169 double uniform(double a, double b);
00174 double normal(double m, double s);
00181 double exponential(double a);
00182 double hyperexponential(double p,double a,double b);
00183 double laplace(double a);
00184 double chisquare(unsigned int n);
00185 double student(unsigned int n);
00186 double lognormal(double a,double b);
00187 double erlang(unsigned int n,double a);
00188 double gamma(double a,double b);
00189 double beta(double a,double b);
00190 double fdistribution(unsigned int n,unsigned int m);
00191 double poisson(double a);
00192 double geometric(double p);
00193 double hypergeometric(unsigned int m,unsigned int n,double p);
00194 double weibull(double a,double b);
00195 double binomial(double p,unsigned int n);
00196 double negativebinomial(double p,unsigned int n);
00197 double triangular(double a);
00198 int probability(double p);
00199 double lngamma(double xx);
00201 ~rv();
00202 private:
00203 random_seq* _impl;
00204 void err(errorType n);
00205 };
00206
00207 }
00208
00209 #endif
00210
00211