$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] Random library, discrete distribution
From: Kevin Martin (kev82_at_[hidden])
Date: 2009-04-05 13:11:22
I made a post sometime last year about requiring a distribution that  
could generate enums with specified probabilities. I find I am  
regularly requiring a discrete distribution like this - where I  
specify the probabilities. Am I the only one who requires it, or would  
it be useful to a wider audience? I'm just wondering whether to submit  
a feature request for it or not?
Thanks,
Kevin Martin
This is what I'm using at the moment:
template<class IntType = int>
class discrete_distribution
{
public:
     typedef boost::uniform_int<>::input_type input_type;
     typedef IntType result_type;
     template<size_t N>
      discrete_distribution(const boost::array<int, N> &outputs,
      const boost::array<int, N> &weights) : outputs_(outputs.begin(),
      outputs.end()), weights_(weights.begin(), weights.end()) {
         for(int i=1;i!=weights_.size();++i) weights_[i] +=  
weights_[i-1];
     }
     inline void reset() {}
     template<class Engine>
     result_type operator()(Engine& eng) {
         boost::uniform_int<> ui(0, weights_.back()-1);
         boost::variate_generator<Engine&, boost::uniform_int<> >  
vg(eng, ui);
         int idx = std::lower_bound(weights_.begin(), weights_.end(),  
vg())
          - weights_.begin();
         return outputs_[idx];
     }
private:
     std::vector<int> outputs_;
     std::vector<int> weights_;
};