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_ptrboost::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_ptrboost::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