00001 #ifndef BZ_RANDOM_DISCRETE_UNIFORM_H 00002 #define BZ_RANDOM_DISCRETE_UNIFORM_H 00003 00004 #include <random/default.h> 00005 00006 BZ_NAMESPACE(ranlib) 00007 00008 template<typename T = unsigned int, typename IRNG = defaultIRNG, 00009 typename stateTag = defaultState> 00010 class DiscreteUniform : public IRNGWrapper<IRNG,stateTag> 00011 { 00012 public: 00013 typedef T T_numtype; 00014 00015 DiscreteUniform(T n) 00016 { 00017 BZPRECONDITION(n < 4294967295U); 00018 n_ = n; 00019 } 00020 00021 DiscreteUniform(T n, unsigned int i) : 00022 IRNGWrapper<IRNG,stateTag>::IRNGWrapper(i) 00023 { 00024 BZPRECONDITION(n < 4294967295U); 00025 n_ = n; 00026 } 00027 00028 T random() 00029 { 00030 return this->irng_.random() % n_; 00031 } 00032 00033 private: 00034 T n_; 00035 }; 00036 00037 BZ_NAMESPACE_END 00038 00039 #endif // BZ_RANDOM_DISCRETE_UNIFORM_H