$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Andy (atompkins_at_[hidden])
Date: 2007-06-11 14:33:16
"Jos Hickson" <jos.hickson_at_[hidden]> wrote in
news:fc03d05a0706060823v59628c64xd1bcda61e9fd5f48_at_[hidden]: 
> On 06/06/07, Peter Dimov <pdimov_at_[hidden]> wrote:
>> Jos Hickson wrote:
>> > On 05/06/07, Peter Dimov <pdimov_at_[hidden]> 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.