Wiselib
|
00001 // vim: set noexpandtab ts=4 sw=4: 00002 00003 #ifndef PC_RAND_H 00004 #define PC_RAND_H 00005 00006 #include "external_interface/pc/pc_os.h" 00007 #include <boost/random.hpp> 00008 00009 namespace wiselib { 00010 00011 template<typename OsModel_P> 00012 class PCRandModel { 00013 public: 00014 typedef OsModel_P OsModel; 00015 typedef uint32_t value_t; 00016 00017 typedef PCRandModel<OsModel> self_type; 00018 typedef self_type* self_pointer_t; 00019 00020 enum { RANDOM_MAX = 0xffffffff }; 00021 00022 enum States 00023 { 00024 READY = OsModel::READY, 00025 NO_VALUE = OsModel::NO_VALUE, 00026 INACTIVE = OsModel::INACTIVE 00027 }; 00028 00029 PCRandModel(); 00030 PCRandModel(PCOs& os); 00031 PCRandModel(PCOs& os, value_t seed); 00032 void srand(value_t seed); 00033 value_t operator()(); 00034 int state(); 00035 00036 private: 00037 boost::uniform_int<uint32_t> distribution_; 00038 boost::mt19937 generator_; 00039 boost::variate_generator< 00040 boost::mt19937&, boost::uniform_int<uint32_t> 00041 > die_; 00042 }; 00043 00044 template<typename OsModel_P> 00045 PCRandModel<OsModel_P>:: 00046 PCRandModel() : 00047 distribution_(0, RAND_MAX), 00048 generator_(), 00049 die_(generator_, distribution_) 00050 { 00051 } 00052 00053 template<typename OsModel_P> 00054 PCRandModel<OsModel_P>:: 00055 PCRandModel(PCOs& os) : 00056 distribution_(0, RAND_MAX), 00057 generator_(), 00058 die_(generator_, distribution_) 00059 { 00060 } 00061 00062 template<typename OsModel_P> 00063 PCRandModel<OsModel_P>:: 00064 PCRandModel(PCOs& os, value_t seed) : 00065 distribution_(0, RAND_MAX), 00066 generator_(seed), 00067 die_(generator_, distribution_) 00068 { 00069 } 00070 00071 template<typename OsModel_P> 00072 void PCRandModel<OsModel_P>:: 00073 srand(value_t seed) { 00074 generator_.seed(seed); 00075 } 00076 00077 template<typename OsModel_P> 00078 typename PCRandModel<OsModel_P>::value_t PCRandModel<OsModel_P>:: 00079 operator()() { 00080 return die_(); 00081 } 00082 00083 template<typename OsModel_P> 00084 int PCRandModel<OsModel_P>:: 00085 state() { 00086 return READY; 00087 } 00088 00089 }; // ns wiselib 00090 00091 #endif // PC_RAND_H 00092