blitz Version 0.10
|
00001 // -*- C++ -*- 00002 // $Id: chisquare.h,v 1.3 2011/03/25 22:41:17 julianc Exp $ 00003 00004 /* 00005 * Chi^2 distribution 00006 * 00007 * This code has been adapted from RANDLIB.C 1.3, by 00008 * Barry W. Brown, James Lovato, Kathy Russell, and John Venier. 00009 * Code was originally by Ahrens and Dieter (see above). 00010 * 00011 * Adapter's notes: 00012 */ 00013 00014 #ifndef BZ_RANDOM_CHISQUARE 00015 #define BZ_RANDOM_CHISQUARE 00016 00017 #ifndef BZ_RANDOM_GAMMA 00018 #include <random/gamma.h> 00019 #endif 00020 00021 BZ_NAMESPACE(ranlib) 00022 00023 template<typename T = double, typename IRNG = defaultIRNG, 00024 typename stateTag = defaultState> 00025 class ChiSquare : public Gamma<T,IRNG,stateTag> 00026 { 00027 public: 00028 typedef T T_numtype; 00029 00030 ChiSquare(T df) 00031 : Gamma<T,IRNG,stateTag>(df/2.0) // isn't this redundant with setDF call? 00032 { 00033 setDF(df); 00034 } 00035 00036 ChiSquare(T df, unsigned int i) 00037 : Gamma<T,IRNG,stateTag>(df/2.0, i) 00038 { 00039 setDF(df); 00040 } 00041 00042 void setDF(T _df) 00043 { 00044 BZPRECONDITION(_df > 0.0); 00045 df = _df; 00046 Gamma<T,IRNG,stateTag>::setMean(df/2.0); 00047 } 00048 00049 T random() 00050 { 00051 return 2.0 * sgamma(); 00052 } 00053 00054 protected: 00055 T sgamma() 00056 { 00057 return Gamma<T,IRNG,stateTag>::random(); 00058 } 00059 00060 T df; 00061 }; 00062 00063 BZ_NAMESPACE_END 00064 00065 #endif // BZ_RANDOM_CHISQUARE