
I'm still having some problems with boost::random, obviously because I don't fully understand all that s going on... Read the documentation and your post but still cannot find what is wrong with my code bellow: extern "C" __declspec(dllexport) double normalReseed(double mean, double sigma, uint32_t x){ boost::normal_distribution<> normal(mean,sigma); boost::variate_generator<boost::mt19937&,boost::normal_distribution<>
rng(gen, normal); rng.engine().seed(x); rng.distribution().reset(); return rng(); } boost::mt19937 gen; boost::normal_distribution<> normal(0,1); boost::variate_generator<boost::mt19937 &,boost::normal_distribution<> die(gen, normal); cout << rng() << endl; cout << rng() << endl; cout << rng() << endl; cout << normalReseed(0, 1, 0) << endl; cout << rng() << endl; cout << rng() << endl; cout << rng() << endl; cout << normalReseed(0, 1, 1) << endl; cout << rng() << endl; cout << rng() << endl; cout << rng() << endl;
I get the following output: 0.2134360137 // #1 sequence normal(0,1) with seed( ) -0.4955802821 // #2 sequence normal(0,1) with seed( ) 1.57537639 // #3 sequence normal(0,1) with seed( ) -1.278008129 // #1 sequence normal(0,1) with seed(0) OK -1.059203928 // #4 sequence normal(0,1) with seed( ) x -0.418455056 // #3 sequence normal(0,1) with seed(0) -1.882579026 // #4 sequence normal(0,1) with seed(0) -2.971829031 // #1 sequence normal(0,1) with seed(1) OK -0.430498971 // #3 sequence normal(0,1) with seed(1) x -2.282022417 // #4 sequence normal(0,1) with seed(1) 0.5236573494 // #5 sequence normal(0,1) with seed(1) Possibly are again cached results from Box-Muller algorithm the reason for this pattern but still cannot see why we get these results, neither how to overcome this problem Anton Skvorts, 2011/1/25 Steven Watanabe <watanabesj@gmail.com>
AMDG
On 1/24/2011 11:29 AM, Anton Skvorts wrote:
Testing boost::random with the following code
boost::mt19937 gener(1); boost::normal_distribution<> normal(0,1); boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal); cout<< rng()<< endl; cout<< rng()<< endl; cout<< rng()<< endl; gener.seed(2); cout<< rng()<< endl; cout<< rng()<< endl; cout<< rng()<< endl;
I'm getting unexpected values after gener.seed(2) -2.971829031 1.706951063 -0.430498971
-2.282022417 x -0.5887503675 0.2504171986
The value -2.282022417 is the forth number in the sequence originated by gener(1) and not the first number in the sequence originated by gener.seed(2) as one would expect (this number is actually -0.5887503675). If I reseed next with gener.seed(3)it works fine, but if after that I reseed again with gener.seed(1) I'll get the same problem, and so on and off...
How can I reseed the random number generator to overcome this problem?
This is because normal_distribution uses Box-Muller, which generates pairs of normal variates. You need to call rng.distribution().reset() to clear the cached result.
In Christ, Steven Watanabe _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost