A wrapper to Boost Random

Boost random is an excellent facility for random number generation in C++. However, to get a random number out it takes some work. This code does that work for you.

/*! \file ran.hpp
    \brief Simplifying wrapper to Boost random number facilities

    Copyright 2009 Tuomas Tonteri. This file is licensed as public domain.

    Usage example: 

	Ran01<float> gen; // Call constructor
        gen(); // Generate a random number

        Ran<double> gen(seed,min,max) // Call constructor
        gen(); // Generate a random number
*/

#ifndef RAN_H
#define RAN_H

#include <boost/random.hpp>

#ifdef unix
#include <fstream>
#else
#include <ctime>
#endif

#ifdef _MSC_VER
typedef unsigned __int64 uint64_t;
typedef __int64 int64_t;
#endif

typedef boost::mt19937 base_generator_type;
//typedef boost::minstd_rand base_generator_type;
//typedef boost::rand48 base_generator_type;
//typedef boost::lagged_fibonacci607 base_generator_type;

#ifdef unix
uint64_t GetSeed()
{
        uint64_t seed;
        std::ifstream urandom;
        urandom.open("/dev/urandom");
        urandom.read(reinterpret_cast<char*> (&seed), sizeof (seed));
        urandom.close();
	return seed;
}
#else
// TODO: Implement a proper GetSeed() on other platforms
uint64_t GetSeed()
{
	return time(NULL);
}
#endif

/// Uniform distribution random numbers between 0 .. 1
template <class realtype>
class Ran01 {
        base_generator_type generator;
        boost::uniform_01<base_generator_type,realtype> gen;
public:
        Ran01(uint64_t seed) : generator((uint64_t)seed), gen(generator) { }
        Ran01(void) : generator((uint64_t)GetSeed()), gen(generator) { }

        realtype operator () (void) { return gen(); } ///< Generate a random number
};

/// Uniform distribution integer random numbers
template <class inttype>
class IRan {
        base_generator_type generator;
        boost::uniform_int<inttype> uni_dist;
        boost::variate_generator<base_generator_type, boost::uniform_int<inttype> > gen;
public:
	IRan(uint64_t seed, inttype min, inttype max) : generator((uint64_t)seed), uni_dist(min,max), gen(generator,uni_dist) { }
	IRan(inttype min, inttype max) : generator((uint64_t)GetSeed()), uni_dist(min,max), gen(generator,uni_dist) { }

        inttype operator () (void) { return gen(); } ///< Generate a random number
};

/// Uniform distribution random numbers
template <class realtype>
class Ran {
	base_generator_type generator;
	boost::uniform_real<realtype> uni_dist;
	boost::variate_generator<base_generator_type, boost::uniform_real<realtype> > gen;
public:
	Ran(uint64_t seed, int min, int max) : generator((uint64_t)seed), uni_dist(min,max), gen(generator,uni_dist) { }
	Ran(int min, int max) : generator((uint64_t)GetSeed()), uni_dist(min,max), gen(generator,uni_dist) { }

	realtype operator () (void) { return gen(); } ///< Generate a random number
};


/// Normal distribution random numbers
template <class realtype>
class Nran {
	base_generator_type generator;
	boost::normal_distribution<realtype> norm_dist;
	boost::variate_generator<base_generator_type, boost::normal_distribution<realtype> > gen;
public:
	Nran(uint64_t seed, int mean, int sigma) : generator((uint64_t)seed), norm_dist(mean,sigma), gen(generator,norm_dist) { }
	Nran(int mean, int sigma) : generator((uint64_t)GetSeed()), norm_dist(mean,sigma), gen(generator,norm_dist) { }
	Nran(uint64_t seed) : generator((uint64_t)seed), norm_dist(0,1), gen(generator,norm_dist) { }
	Nran() : generator((uint64_t)GetSeed()), norm_dist(0,1), gen(generator,norm_dist) { }

	realtype operator () (void) { return gen(); } ///< Generate a random number
};

#endif