#include <iostream>
#include <fstream>
#include <ctime>
#include <boost/random/linear_congruential.hpp>
#include <boost/random/uniform_int.hpp>
#include <boost/random/uniform_real.hpp>
#include <boost/random/variate_generator.hpp>
#include <boost/generator_iterator.hpp>
typedef boost::minstd_rand base_generator_type;
void experiment(base_generator_type & generator)
{
typedef boost::uniform_int<> distribution_type;
typedef boost::variate_generator<base_generator_type&, distribution_type> gen_type;
gen_type die_gen(generator, distribution_type(1, 6));
boost::generator_iterator<gen_type> die(&die_gen);
for(int i = 0; i < 10; i++)
std::cout << *die++ << " ";
std::cout << '\n';
}
int main()
{
base_generator_type generator(42);
std::cout << "10 samples of a uniform distribution in [0..1):\n";
boost::uniform_real<> uni_dist(0,1);
boost::variate_generator<base_generator_type&, boost::uniform_real<> > uni(generator, uni_dist);
std::cout.setf(std::ios::fixed);
for(int i = 0; i < 10; i++)
std::cout << uni() << '\n';
generator.seed(static_cast<unsigned int>(std::time(0)));
std::cout << "\nexperiment: roll a die 10 times:\n";
base_generator_type saved_generator = generator;
experiment(generator);
std::cout << "redo the experiment to verify it:\n";
experiment(saved_generator);
assert(generator == saved_generator);
boost::uniform_int<> degen_dist(4,4);
boost::variate_generator<base_generator_type&, boost::uniform_int<> > deg(generator, degen_dist);
std::cout << deg() << " " << deg() << " " << deg() << std::endl;
{
std::ofstream file("rng.saved", std::ofstream::trunc);
file << generator;
}
return 0;
}