#include #include #include #include using namespace boost; typedef normal_distribution normal_dist; typedef uniform_int<> uni_dist; typedef mt19937 mt_generator; typedef variate_generator normal_generator; typedef variate_generator uni_generator; // Sampling the copied uniform random number generator yields the expected result void sample_uni(){ std::cout << "Uniform: " << std::endl << std::endl; mt_generator mt( 1152 ); //arbitrary seed, sufficient to demonstrate the bug uni_dist dist( 0 , 9 ); uni_generator gen1( mt , dist ); gen1(); // sample gen1 first time uni_generator gen2( gen1 ); // copy generator std::cout << "Initial generator - Copied generator" << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; } // Sampling the copied normal distribution random number generator yields the shifted sequence void sample_normal(){ std::cout << "Normal distribution: " << std::endl << std::endl; mt_generator mt( 1152 ); //arbitrary seed, sufficient to demonstrate the bug normal_dist dist( 0 , 1 ); normal_generator gen1( mt , dist ); gen1(); // sample gen1 first time normal_generator gen2( gen1 ); // copy generator std::cout << "Initial generator - Copied generator" << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; std::cout << " " << gen1() << " " << gen2() << std::endl; } int main(){ sample_normal(); std::cout << std::endl << std::endl << "--------------------------------------------" << std::endl << std::endl; sample_uni(); return 0; }