00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef BZ_RANDOM_NORMAL
00022 #define BZ_RANDOM_NORMAL
00023
00024 #ifndef BZ_RANDOM_UNIFORM
00025 #include <random/uniform.h>
00026 #endif
00027
00028 BZ_NAMESPACE(ranlib)
00029
00030 template<typename T = double, typename IRNG = defaultIRNG,
00031 typename stateTag = defaultState>
00032 class NormalUnit : public UniformOpen<T,IRNG,stateTag>
00033 {
00034 public:
00035 typedef T T_numtype;
00036
00037 NormalUnit() {}
00038
00039 explicit NormalUnit(unsigned int i) :
00040 UniformOpen<T,IRNG,stateTag>(i) {};
00041
00042 T random()
00043 {
00044 const T s = 0.449871, t = -0.386595, a = 0.19600, b = 0.25472;
00045 const T r1 = 0.27597, r2 = 0.27846;
00046
00047 T u, v;
00048
00049 for (;;) {
00050
00051
00052
00053
00054
00055
00056 u = this->getUniform();
00057 v = 1.715527769921413592960379282557544956242L
00058 * (this->getUniform() - 0.5);
00059
00060
00061 T x = u - s;
00062 T y = fabs(v) - t;
00063 T q = x*x + y*(a*y - b*x);
00064
00065
00066 if (q < r1)
00067 break;
00068
00069
00070 if (q > r2)
00071 continue;
00072
00073
00074 if (v*v <= -4.0 * log(u)*u*u)
00075 break;
00076 }
00077
00078 return v/u;
00079 }
00080
00081 };
00082
00083
00084 template<typename T = double, typename IRNG = defaultIRNG,
00085 typename stateTag = defaultState>
00086 class Normal : public NormalUnit<T,IRNG,stateTag> {
00087
00088 public:
00089 typedef T T_numtype;
00090
00091 Normal(T mean, T standardDeviation)
00092 {
00093 mean_ = mean;
00094 standardDeviation_ = standardDeviation;
00095 }
00096
00097 Normal(T mean, T standardDeviation, unsigned int i) :
00098 NormalUnit<T,IRNG,stateTag>(i)
00099 {
00100 mean_ = mean;
00101 standardDeviation_ = standardDeviation;
00102 };
00103
00104 T random()
00105 {
00106 return mean_ + standardDeviation_
00107 * NormalUnit<T,IRNG,stateTag>::random();
00108 }
00109
00110 private:
00111 T mean_;
00112 T standardDeviation_;
00113 };
00114
00115 BZ_NAMESPACE_END
00116
00117 #endif // BZ_RANDOM_NORMAL