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 T random()
00036 {
00037 return - log(UniformOpen<T,IRNG,stateTag>::random());
00038 }
00039 };
00040
00041 template<typename T = double, typename IRNG = defaultIRNG,
00042 typename stateTag = defaultState>
00043 class Exponential : public ExponentialUnit<T,IRNG,stateTag> {
00044
00045 public:
00046 typedef T T_numtype;
00047
00048 Exponential(T mean)
00049 {
00050 mean_ = mean;
00051 }
00052
00053 T random()
00054 {
00055 return mean_ * ExponentialUnit<T,IRNG,stateTag>::random();
00056 }
00057
00058 private:
00059 T mean_;
00060 };
00061
00062 BZ_NAMESPACE_END
00063
00064 #endif // BZ_RANDOM_EXPONENTIAL