LocARNA-1.8.11
discrete_distribution.hh
1 #ifndef LOCARNA_DISCRETE_DISTRIBUTION
2 #define LOCARNA_DISCRETE_DISTRIBUTION
3 
4 #ifdef HAVE_CONFIG_H
5 # include <config.h>
6 #endif
7 
8 namespace LocARNA {
9 
10  // ------------------------------------------------------------
14  private:
15  std::vector<double> distrib_acc_;
16  public:
22  DiscreteDistribution(const std::vector<double> &distvec)
23  {
24  if (distvec.size()==0) return;
25 
26  distrib_acc_.resize(distvec.size());
27 
28  distrib_acc_[0] = distvec[0];
29  for (size_t i=1; i<distvec.size(); i++) {
30  distrib_acc_[i]+=distrib_acc_[i-1]+distvec[i];
31  }
32  double max_acc = distrib_acc_[distvec.size()-1];
33  for (size_t i=0; i<distvec.size(); i++) {
34  distrib_acc_[i]/=max_acc;
35  }
36  }
37 
44  size_t
45  operator () (size_t x) {
46  double y=x/(double)RAND_MAX;
47 
48  size_t i=0;
49  for (; i<distrib_acc_.size() && y>distrib_acc_[i]; ++i)
50  ;
51 
52  assert(i<=distrib_acc_.size());
53  return i;
54  }
55  };
56 
57 } // end namespace LocARNA
58 
59 #endif //LOCARNA_DISCRETE_DISTRIBUTION
60 
size_t operator()(size_t x)
get random number
Definition: discrete_distribution.hh:45
Definition: aligner.cc:17
DiscreteDistribution(const std::vector< double > &distvec)
Construct with distribution vector.
Definition: discrete_distribution.hh:22
Definition: discrete_distribution.hh:13