32 #ifndef VSMC_RNG_GSL_HPP
33 #define VSMC_RNG_GSL_HPP
37 #include <gsl/gsl_rng.h>
39 #define VSMC_DEFINE_RNG_GSL_RNG_TYPE_POINTER(Generator, pointer) \
40 template <> struct GSLRngTypePointer< GSL_RNG_TYPE_##Generator > \
41 {static const ::gsl_rng_type *get () {return ::gsl_rng_##pointer ;}};
43 #define VSMC_DEFINE_RNG_GSL_RNG_MIN_MAX(Generator, Min, Max) \
44 template <> struct GSLRngMinMax< GSL_RNG_TYPE_##Generator > \
46 static VSMC_CONSTEXPR const uint32_t _Min = \
47 static_cast<uint32_t>(Min##UL); \
48 static VSMC_CONSTEXPR const uint32_t _Max = \
49 static_cast<uint32_t>(Max##UL); \
50 static VSMC_CONSTEXPR uint32_t min VSMC_MNE () {return _Min;} \
51 static VSMC_CONSTEXPR uint32_t max VSMC_MNE () {return _Max;} \
52 }; // VSMC_DEFINE_RNG_GSL_RNG_MIN_MAX
117 rng_(::gsl_rng_alloc(internal::GSLRngTypePointer<RngType>::
get())) {}
120 rng_(::gsl_rng_clone(other.rng_)) {}
125 ::gsl_rng_memcpy(rng_, other.rng_);
130 #if VSMC_HAS_CXX11_RVALUE_REFERENCES
139 swap(rng_, other.rng_);
148 ::gsl_rng_free(rng_);
154 ::gsl_rng_set(rng_, s);
160 return ::gsl_rng_get(rng_);
165 unsigned long min
VSMC_MNE ()
const {return ::gsl_rng_min(rng_);}
166 unsigned long max
VSMC_MNE ()
const {return ::gsl_rng_max(rng_);}
175 template <GSLRngType RngType>
178 internal::GSLRngMinMax<RngType> >
189 template <
typename SeedSeq>
196 {this->generator().seed(static_cast<unsigned long>(s));}
198 template <
typename SeedSeq>
205 seq.generate(&s, &s + 1);
206 this->generator().seed(s);
265 #endif // VSMC_RNG_GSL_HPP
GSLGenerator(const GSLGenerator< RngType > &other)
GSLEngine< GSL_RNG_TYPE_RANLXS0 > GSL_RANLXS0
A RANLUX generator with luxury level 0.
GSLEngine< GSL_RNG_TYPE_RANLUX > GSL_RANLUX
A RANLUX generator.
GSLEngine< GSL_RNG_TYPE_CMRG > GSL_CMRG
A combined multiple recursive generator.
void seed(SeedSeq &seq, typename cxx11::enable_if< internal::is_seed_seq< SeedSeq, result_type, GSLEngine< RngType > >::value >::type *=nullptr)
GSLEngine< GSL_RNG_TYPE_TAUS > GSL_TAUS
A maximally equidistributed combined Tausworthe generator.
#define VSMC_DEFINE_RNG_GSL_RNG_TYPE_POINTER(Generator, pointer)
GSLEngine< GSL_RNG_TYPE_RANLUX389 > GSL_RANLUX389
A RANLUX generator with the highest level of randomness.
GSLEngine< GSL_RNG_TYPE_MRG > GSL_MRG
A fifth-order multiple recursive generator.
T & get(Array< T, N > &ary)
Array ADL of get.
#define VSMC_MNE
Avoid MSVC stupid behavior: MNE = Macro No Expansion.
GSLEngine< GSL_RNG_TYPE_RANLXS1 > GSL_RANLXS1
A RANLUX generator with luxury level 0.
A thin wrapper over any RNG Generator for use with C++11 API.
GSLEngine(SeedSeq &seq, typename cxx11::enable_if< internal::is_seed_seq< SeedSeq, result_type, GSLEngine< RngType > >::value >::type *=nullptr)
GSLRngType
GSL RNG algorithms.
GSLEngine< GSL_RNG_TYPE_RANLXS2 > GSL_RANLXS2
A RANLUX generator with luxury level 0.
GSLEngine< GSL_RNG_TYPE_MT19937 > GSL_MT19937
A Mersenne-Twister pseudoranom number genertor.
#define VSMC_NULLPTR
nullptr
GSL RNG generator for use with GeneratorWrapper.
void swap(Array< T, N > &ary1, Array< T, N > &ary2)
Array ADL of swap.
GSLGenerator(GSLGenerator< RngType > &&other)
GSLEngine< GSL_RNG_TYPE_TAUS2 > GSL_TAUS2
A maximally equidistributed combined Tausworthe generator with improved seeding procedure.
GSLEngine< GSL_RNG_TYPE_RANLXD1 > GSL_RANLXD1
A RANLXS generator with luxury level 1.
GSLEngine< GSL_RNG_TYPE_GFSR4 > GSL_GFSR4
A a lagged-fibonacci alike generator.
GSLEngine< GSL_RNG_TYPE_RANLXD2 > GSL_RANLXD2
A RANLXS generator with luxury level 2.
GSLEngine(result_type s=0)
void seed(unsigned long s)
#define VSMC_DEFINE_RNG_GSL_RNG_MIN_MAX(Generator, Min, Max)