...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
For the source of this example see die.cpp.
First we include the headers we need for mt19937
and uniform_int
.
#include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_int.hpp> #include <boost/random/variate_generator.hpp>
We use mt19937
with the default
seed as a source of randomness. The numbers produced will be the same every
time the program is run. One common method to change this is to seed with
the current time (std::time(0)
defined in ctime).
boost::mt19937 gen;
![]() |
Note |
---|---|
We are using a global generator object here. This is important because we don't want to create a new pseudo-random number generator at every call |
Now we can define a function that simulates an ordinary six-sided die.
int roll_die() {boost::uniform_int<> dist(1, 6);
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die(gen, dist);
return die(); }
|
||||
|
||||
A |
For the source of this example see weighted_die.cpp.
#include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_real.hpp> #include <boost/random/variate_generator.hpp> #include <vector> #include <algorithm> #include <numeric> boost::mt19937 gen;
This time, instead of a fair die, the probability of rolling a 1 is 50% (!). The other five faces are all equally likely.
static const double probabilities[] = { 0.5, 0.1, 0.1, 0.1, 0.1, 0.1 };
Now define a function that simulates rolling this die. Note that the C++0x
library contains a discrete_distribution
class which would be a better way to do this.
int roll_weighted_die() { std::vector<double> cumulative; std::partial_sum(&probabilities[0], &probabilities[0] + 6, std::back_inserter(cumulative)); boost::uniform_real<> dist(0, cumulative.back()); boost::variate_generator<boost::mt19937&, boost::uniform_real<> > die(gen, dist);return (std::lower_bound(cumulative.begin(), cumulative.end(), die()) - cumulative.begin()) + 1; }