Boost logo

Boost :

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.

    


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk