blob: b8c50d061ab78fccfce43648d93272868b4656d6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
* Copyright (c) 2012 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#include <Swiften/Base/BoostRandomGenerator.h>
#include <numeric>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>
namespace Swift {
int BoostRandomGenerator::generateWeighedRandomNumber(std::vector<double>::const_iterator probabilities_begin, std::vector<double>::const_iterator probabilities_end) {
// Only works starting boost 1.47
//boost::random::discrete_distribution<> distribution(weights.begin(), weights.end());
//return distribution(generator);
std::vector<double> cumulative;
std::partial_sum(probabilities_begin, probabilities_end, std::back_inserter(cumulative));
boost::uniform_real<> dist(0, cumulative.back());
boost::variate_generator<boost::mt19937&, boost::uniform_real<> > die(generator, dist);
return std::lower_bound(cumulative.begin(), cumulative.end(), die()) - cumulative.begin();
}
}
|