
"Jos Hickson" <jos.hickson@gmail.com> wrote in news:fc03d05a0706060823v59628c64xd1bcda61e9fd5f48@mail.gmail.com:
On 06/06/07, Peter Dimov <pdimov@mmltd.net> wrote:
Jos Hickson wrote:
On 05/06/07, Peter Dimov <pdimov@mmltd.net> wrote:
[snip] ... and if Engine is a template parameter, we probably need to support engines that only take a 32 bit seed anyway.
Isn't it the case that the maximum seed size is related (equal?) to the difference between the max and min values produced by a particular engine and also that all the engines in Boost Random provide the iterator version of seed?
The seed for mt19937 is 624 words. Aah, a bit bigger then!
I have been thinking about this for awhile now, and maybe I should use Peter's suggestion and only support random number generators that can be seeded with a single number. And xor with rd_. I have been playing with another solution. I wrapped the seed function in a class that models the random number generator concept. Then used Boost.Iterators' function output iterator, and feed it into the seed function that takes iterators of the random number generator. // not that this is not quite complete class seed_rng { public: seed_rng() : rd_index_(5) {} unsigned operator()() { if (rd_index_ >= 5) { sha1_random_digest_(); // fill rd_ with new data rd_index_ = 0; } return rd_[rd_index_++]; } private: sha1_random_digest_(); unsigned rd_[5]; int rd_index_; }; template <typename Engine=boost::mt19937> class uuid_generator { public: uuid_generator() { boost::seed_rgn e; boost::generator_iterator<boost::seed_rng> begin(&e); boost::generator_iterator<boost::seed_rnd> end; en_.seed(begin, end); } boost::uuid operator()() { // get random data from en_ // return uuid based on this data } private: Engine en_; }; Now this works fine, the slow seed_rng is used to fully seed the random number generator used. It can be specialized for boost::random_device since boost::random_device does not have a seed function. Andy.