
On 26 Jul 2009, at 03:44, Diederick C. Niehorster wrote:
I have been writing a wrapper around the variate_generator as I always want to use the same number generator, but do want to use different distributions.
I must admit I haven't read all your code in detail, so it may do more than I realise, but I had the same problem as this a while ago. My solution was a little simpler, I just use a static boost::shared_ptr to hold the singleton instance and for a given distribution I put the variate_generator into a boost::function. I like this approach because it will cause an exception if I try and use the generator before I've seeded it, and it will also complain if I accidently initialise it more than once. Thanks, Kevin Martin static boost::shared_ptr<boost::mt19937> generator_; boost::mt19937 &grng_generator() { if(generator_) return *generator_; throw std::runtime_error("Requrested RNG, but there isn't one"); } void grng_setGenerator(boost::shared_ptr<boost::mt19937> ptr) { if(!ptr) throw std::runtime_error("Tried to set generator to NULL pointer"); if(generator_) throw std::runtime_error("Tried to set generator more than once"); generator_ = ptr; } template<class Distribution_> boost::function0<typename Distribution_::result_type> grng_randomVariable(const Distribution_ &d) { boost::variate_generator<boost::mt19937&, Distribution_> rv( grng_generator(), d); return boost::function0<typename Distribution_::result_type>(rv); }