00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef eoRndGenerators_h
00030 #define eoRndGenerators_h
00031
00032 #include "eoRNG.h"
00033 #include <eoFunctor.h>
00034 #include <stdexcept>
00035
00036 using eo::rng;
00037
00046 template <class T>
00047 class eoRndGenerator : public eoF<T>
00048 {
00049 typedef T AtomType;
00050 };
00051
00066 template <class T = double> class eoUniformGenerator : public eoRndGenerator<T>
00067 {
00068
00069
00070 public :
00071 eoUniformGenerator(T _max = T(1.0), eoRng& _rng = rng) :
00072 minim(T(0.0)), range(_max), uniform(_rng) {}
00073 eoUniformGenerator(T _min, T _max, eoRng& _rng = rng) :
00074 minim(_min), range(_max-_min), uniform(_rng)
00075 {
00076 if (_min>_max)
00077 throw std::logic_error("Min is greater than Max in uniform_generator");
00078 }
00079
00084 T operator()(void) { return minim+static_cast<T>(uniform.uniform(range)); }
00085
00086 private :
00087 T minim;
00088 T range;
00089 eoRng& uniform;
00090 };
00091
00092
00094 template <>
00095 inline bool eoUniformGenerator<bool>::operator()(void)
00096 {
00097 return uniform.flip(0.5);
00098 }
00099
00104 class eoBooleanGenerator : public eoRndGenerator<bool>
00105 {
00106 public :
00107 eoBooleanGenerator(float _bias = 0.5, eoRng& _rng = rng) : bias(_bias), gen(_rng) {}
00108
00109 bool operator()(void) { return gen.flip(bias); }
00110 private :
00111 float bias;
00112 eoRng& gen;
00113 };
00114
00120 template <class T = double> class eoNormalGenerator : public eoRndGenerator<T>
00121 {
00122 public :
00123 eoNormalGenerator(T _stdev = T(1.0), eoRng& _rng = rng) : stdev(_stdev), normal(_rng) {}
00124
00125 T operator()(void) { return (T) normal.normal(stdev); }
00126
00127 private :
00128 T stdev;
00129 eoRng& normal;
00130 };
00131
00137 template <class T = double> class eoNegExpGenerator : public eoRndGenerator<T>
00138 {
00139 public :
00140 eoNegExpGenerator(T _mean = 1.0, eoRng& _rng = rng) : mean(_mean), negexp(_rng) {}
00141
00142 T operator()(void) { return (T) negexp.negexp(mean); }
00143
00144 private :
00145 T mean;
00146 eoRng& negexp;
00147 };
00148
00149 #endif