00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef BZ_RANDOM_EXPONENTIAL
00020 #define BZ_RANDOM_EXPONENTIAL
00021
00022 #ifndef BZ_RANDOM_UNIFORM
00023 #include <random/uniform.h>
00024 #endif
00025
00026 BZ_NAMESPACE(ranlib)
00027
00028 template<typename T = double, typename IRNG = defaultIRNG,
00029 typename stateTag = defaultState>
00030 class ExponentialUnit : public UniformOpen<T,IRNG,stateTag>
00031 {
00032 public:
00033 typedef T T_numtype;
00034
00035 ExponentialUnit() {}
00036
00037 explicit ExponentialUnit(unsigned int i) :
00038 UniformOpen<T,IRNG,stateTag>(i) {};
00039
00040 T random()
00041 {
00042 return - log(UniformOpen<T,IRNG,stateTag>::random());
00043 }
00044 };
00045
00046 template<typename T = double, typename IRNG = defaultIRNG,
00047 typename stateTag = defaultState>
00048 class Exponential : public ExponentialUnit<T,IRNG,stateTag> {
00049
00050 public:
00051 typedef T T_numtype;
00052
00053 Exponential(T mean)
00054 {
00055 mean_ = mean;
00056 }
00057
00058 Exponential(T mean, unsigned int i) :
00059 UniformOpen<T,IRNG,stateTag>(i)
00060 {
00061 mean_ = mean;
00062 };
00063
00064 T random()
00065 {
00066 return mean_ * ExponentialUnit<T,IRNG,stateTag>::random();
00067 }
00068
00069 private:
00070 T mean_;
00071 };
00072
00073 BZ_NAMESPACE_END
00074
00075 #endif // BZ_RANDOM_EXPONENTIAL