#ifndef __BOOSTRANDOM_H_
#define __BOOSTRANDOM_H_

#include "Random.h"

#include <boost/random.hpp>

class BoostRandom : public Random {
  protected:
    // typedef boost::lagged_fibonacci607 GeneratorType;
    typedef boost::mt19937 GeneratorType;

    typedef boost::uniform_smallint<int> IntegerDistribution;
    typedef boost::uniform_real<FloatType> RealDistribution;
    typedef boost::bernoulli_distribution<FloatType> RandomBitDistribution;
    typedef boost::uniform_01<GeneratorType, FloatType> ZeroOneDistribution;
    typedef boost::variate_generator<GeneratorType, RealDistribution> RealGenerator;
    typedef boost::variate_generator<GeneratorType, IntegerDistribution> IntegerGenerator;

    static const FloatType defaultFloatFrom;
    static const FloatType defaultFloatTo;
    static const int defaultIntFrom;
    static const int defaultIntTo;

    GeneratorType generator;
    RandomBitDistribution dist_bool;
    ZeroOneDistribution dist_01;
    FloatType floatFrom, floatTo;
    RealGenerator dist_float;
    int intFrom, intTo;
    IntegerGenerator dist_int;

  public:
    BoostRandom();
    bool getBit();
    FloatType get01();
    FloatType getFloat( FloatType from, FloatType to );
    int getInt( int from, int to );
};

#endif /* __BOOSTRANDOM_H_ */
