
christopher diggins wrote:
AFAICT the shortest way to emulate the std::rand() function using boost/random.hpp would be as follows:
unsigned int longhand_boost_rand() { boost::mt19937 rng; boost::uniform_int<> dist(0, RAND_MAX); boost::variate_generator < boost::mt19937, boost::uniform_int<> > generator(rng, dist); return generator(); }
(apologies if I made any mistakes)
You can make it a bit shorter, I believe: boost::mt19937 e; return boost::uniform_int<>(0, 100)(e); I find 'variate_generator' to be only usefull when you want to get functional object to pass to some other function. If you want to directly produce random number, it's not needed.
I was wondering if there would be any reason not to provide a utility function which made it easier to write random number generators. For instance, the following:
template<class Dist_T, class Rng_T> typename boost::variate_generator<Rng_T, Dist_T>::result_type generate_rand(Dist_T dist, Rng_T rng) { return boost::variate_generator<Rng_T, Dist_T>(rng, dist)(); }
would allow us to rewrite our rand function as follows.
unsigned int shorthand_boost_rand() { return generate_rand(boost::uniform_int<>(0, RAND_MAX), boost::mt19937()); }
Did you try the above code? I have some suspicions that you might copy the mt19937 instance, and IIRC it's not that small. On a related note, I've run boost::mt19937 e; return boost::uniform_int<>(0, 100)(e); under profiler, and the price for constructing the mt19937 object and getting the int is roughly the same. This means that creating mt19937 object for each random number will give 2x running time increase. And as mentioned by Michael, the numbers won't be very randon either. - Volodya