KrisLibrary  1.0.0
FastSampler.h
1 #ifndef UTILS_FAST_SAMPLER_H
2 #define UTILS_FAST_SAMPLER_H
3 
8 struct FastSampler
9 {
10  FastSampler(const std::vector<double>& probabilities) {
11  sump.resize(probabilities.size());
12  double sum=0;
13  for(size_t i=0;i<probabilities.size();i++) {
14  sum += probabilities[i];
15  sump[i] = sum;
16  }
17  }
18 
19  template <class RNG>
20  int Sample(RNG& rng) const {
21  double val = rng.randDouble(sump.back());
22  return Pick(val);
23  }
24 
25  inline int Pick(double val) const {
26  std::vector<double>::const_iterator i=std::upper_bound(sump.begin(),sump.end(),val);
27  return (i-sump.begin())-1;
28  }
29 
30  //partial sums over probabilities
31  std::vector<double> sump;
32 };
33 
34 #endif
Samples from a weighted discrete set in O(log(n)) time after an O(n) initialization.
Definition: FastSampler.h:8