http://stxxl.sourceforge.net
<dementiev@mpi-sb.mpg.de>
<beckmann@mpi-inf.mpg.de>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_RAND_HEADER
#define STXXL_RAND_HEADER
#include <cstdlib>
#ifdef STXXL_BOOST_RANDOM
#include <boost/random.hpp>
#endif
#include <stxxl/bits/common/types.h>
#include <stxxl/bits/common/seed.h>
__STXXL_BEGIN_NAMESPACE
extern unsigned ran32State;
struct random_number32
{
typedef unsigned value_type;
inline value_type operator () () const
{
return (ran32State = 1664525 * ran32State + 1013904223);
}
};
inline void srandom_number32(unsigned seed = 0)
{
if (!seed)
seed = get_next_seed();
ran32State = seed;
}
struct random_number32_r
{
typedef unsigned value_type;
mutable unsigned state;
random_number32_r(unsigned seed = 0)
{
if (!seed)
seed = get_next_seed();
state = seed;
}
inline value_type operator () () const
{
return (state = 1664525 * state + 1013904223);
}
};
struct random_uniform_fast
{
typedef double value_type;
random_number32 rnd32;
random_uniform_fast(unsigned = 0)
{ }
inline value_type operator () () const
{
return (double(rnd32()) * (0.5 / 0x80000000));
}
};
struct random_uniform_slow
{
typedef double value_type;
#ifdef STXXL_BOOST_RANDOM
typedef boost::minstd_rand base_generator_type;
base_generator_type generator;
boost::uniform_real<> uni_dist;
mutable boost::variate_generator<base_generator_type &, boost::uniform_real<> > uni;
random_uniform_slow(unsigned seed = 0) : uni(generator, uni_dist)
{
if (!seed)
seed = get_next_seed();
uni.engine().seed(seed);
}
#else
mutable unsigned short state48[3];
random_uniform_slow(unsigned seed = 0)
{
if (!seed)
seed = get_next_seed();
state48[0] = seed & 0xffff;
state48[1] = seed >> 16;
state48[2] = 42;
erand48(state48);
}
#endif
inline value_type operator () () const
{
#ifdef STXXL_BOOST_RANDOM
return uni();
#else
return erand48(state48);
#endif
}
};
template <class UniformRGen_ = random_uniform_fast>
struct random_number
{
typedef unsigned value_type;
UniformRGen_ uniform;
random_number(unsigned seed = 0) : uniform(seed)
{ }
inline value_type operator () (value_type N) const
{
return static_cast<value_type>(uniform() * double(N));
}
};
struct random_number64
{
typedef stxxl::uint64 value_type;
random_uniform_slow uniform;
random_number64(unsigned seed = 0) : uniform(seed)
{ }
inline value_type operator () () const
{
return static_cast<value_type>(uniform() * (18446744073709551616.));
}
};
__STXXL_END_NAMESPACE
#endif