00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef BZ_RANDOM_CHISQUARE
00012 #define BZ_RANDOM_CHISQUARE
00013
00014 #ifndef BZ_RANDOM_GAMMA
00015 #include <random/gamma.h>
00016 #endif
00017
00018 BZ_NAMESPACE(ranlib)
00019
00020 template<typename T = double, typename IRNG = defaultIRNG,
00021 typename stateTag = defaultState>
00022 class ChiSquare : public Gamma<T,IRNG,stateTag>
00023 {
00024 public:
00025 typedef T T_numtype;
00026
00027 ChiSquare(T df)
00028 : Gamma<T,IRNG,stateTag>(df/2.0)
00029 {
00030 setDF(df);
00031 }
00032
00033 ChiSquare(T df, unsigned int i)
00034 : Gamma<T,IRNG,stateTag>(df/2.0, i)
00035 {
00036 setDF(df);
00037 }
00038
00039 void setDF(T _df)
00040 {
00041 BZPRECONDITION(_df > 0.0);
00042 df = _df;
00043 Gamma<T,IRNG,stateTag>::setMean(df/2.0);
00044 }
00045
00046 T random()
00047 {
00048 return 2.0 * sgamma();
00049 }
00050
00051 protected:
00052 T sgamma()
00053 {
00054 return Gamma<T,IRNG,stateTag>::random();
00055 }
00056
00057 T df;
00058 };
00059
00060 BZ_NAMESPACE_END
00061
00062 #endif // BZ_RANDOM_CHISQUARE