2 #ifndef OPENGM_RANDOM_HXX
3 #define OPENGM_RANDOM_HXX
16 class RandomUniformBase;
18 class RandomUniformFloatingPoint;
20 class RandomUniformInteger;
22 class RandomUniformUnknown;
27 class RandomUniformBase
30 RandomUniformBase& operator=(
const RandomUniformBase& src)
39 RandomUniformBase(
const T low = 0,
const T high = 1)
44 void setLow(
const T low) {
48 void setHigh(
const T high) {
56 template<
class>
friend class RandomUniformInteger;
57 template<
class>
friend class RandomUniformFloatingPoint;
58 template<
class>
friend class RandomUniformUnknown;
59 template<
class>
friend class RandomUniform;
63 class RandomUniformInteger
64 :
public RandomUniformBase<T>
67 RandomUniformInteger(
const T low = 0,
const T high = 1)
68 : RandomUniformBase<T>(low, high)
71 RandomUniformInteger(
const T low,
const T high,
const size_t seed)
72 : RandomUniformBase<T>(low, high)
82 T randomNumber = this->high_;
83 while(randomNumber == this->high_) {
84 randomNumber =
static_cast<T
>((rand() % (this->high_ - this->low_)) + this->low_);
89 template<
class>
friend class RandomUniform;
93 class RandomUniformFloatingPoint
94 :
public RandomUniformBase<T>
97 RandomUniformFloatingPoint(
const T low = 0,
const T high = 1)
98 : RandomUniformBase<T>(low, high)
101 RandomUniformFloatingPoint(
const T low,
const T high,
const size_t seed)
102 : RandomUniformBase<T>(low, high)
112 T randomNumber = this->high_;
113 while(randomNumber == this->high_) {
114 randomNumber = (
static_cast<T
>(rand()) / static_cast<T>(RAND_MAX)) * (this->high_ - this->low_) + this->low_;
119 template<
class>
friend class RandomUniform;
123 class RandomUniformUnknown : RandomUniformBase<T> {
124 template<
class>
friend class RandomUniform;
132 opengm::meta::IsFundamental<T>::value,
133 typename opengm::meta::If
135 opengm::meta::IsFloatingPoint<T>::value,
136 opengm::RandomUniformFloatingPoint<T>,
137 opengm::RandomUniformInteger<T>
139 RandomUniformUnknown<T>
143 typedef typename opengm::meta::If
145 opengm::meta::IsFundamental<T>::value,
146 typename opengm::meta::If
148 opengm::meta::IsFloatingPoint<T>::value,
149 opengm::RandomUniformFloatingPoint<T>,
150 opengm::RandomUniformInteger<T>
152 RandomUniformUnknown<T>
156 RandomUniform(
const T low = 0,
const T high = 1)
157 : BaseType(low, high)
160 RandomUniform(
const T low,
const T high,
const size_t seed)
161 : BaseType(low, high, seed)
165 template<
class T,
class U>
166 class RandomDiscreteWeighted
169 RandomDiscreteWeighted() {}
171 template<
class Iterator>
172 RandomDiscreteWeighted(Iterator begin, Iterator end)
173 : probSum_(std::distance(begin, end)),
174 randomFloatingPoint_(0, 1)
178 for(
size_t i=0;i<probSum_.size();++i) {
179 probSum_[i]=
static_cast<U
>(*begin);
184 for(
size_t i=1;i<probSum_.size();++i) {
186 probSum_[i]+=probSum_[i-1];
190 template<
class Iterator>
191 RandomDiscreteWeighted(Iterator begin, Iterator end,
size_t seed)
192 : probSum_(std::distance(begin, end)),
193 randomFloatingPoint_(0, 1, seed)
197 for(
size_t i=0;i<probSum_.size();++i) {
198 probSum_[i]=
static_cast<U
>(*begin);
204 for(
size_t i=1;i<probSum_.size();++i) {
206 probSum_[i]+=probSum_[i-1];
212 U rnd = randomFloatingPoint_();
213 if(rnd < probSum_[0]) {
216 for(
size_t i=0;i<probSum_.size()-1;++i) {
217 if(probSum_[i]<=rnd && rnd<probSum_[i+1]) {
218 return static_cast<T
>(i+1);
221 return static_cast<T
>(probSum_.size() - 1);
225 std::vector<U> probSum_;
226 opengm::RandomUniform<U> randomFloatingPoint_;
233 #endif // #ifndef OPENGM_RANDOM_HXX