6 #ifndef THEORETICA_PRNG_H
7 #define THEORETICA_PRNG_H
11 #include "../core/error.h"
29 std::vector<uint64_t> param;
37 const std::vector<uint64_t>& s) : f(p), x(
seed), param(s) {}
45 const std::vector<uint64_t>& s) : f(p), x(1), param(s) {}
68 return x = f(x, param);
82 for (uint64_t i = 0; i < n; ++i)
88 inline uint64_t
last()
const {
181 uint64_t p1 = 2549536629329, uint64_t p2 = 136137137) {
195 uint64_t
seed, uint64_t offset = 765872292751861) {
201 offset = 765872292751861;
214 template<
typename Vector>
215 inline void shuffle(Vector& v,
PRNG& g,
unsigned int rounds = 0) {
222 rounds =
square(v.size() - 1);
224 for (
unsigned int i = 0; i < rounds; ++i) {
227 size_t index1 = g() % v.size();
228 size_t index2 = g() % v.size();
231 const auto x1 = v[index1];
232 v[index1] = v[index2];
A pseudorandom number generator.
Definition: prng.h:18
static PRNG middlesquare(uint64_t seed, uint64_t offset=765872292751861)
Returns a Middle-square generator.
Definition: prng.h:194
uint64_t last() const
Return the last generated number.
Definition: prng.h:88
static PRNG linear_congruential(uint64_t seed=1)
Returns a standard linear congruential generator.
Definition: prng.h:130
PRNG & operator>>(uint64_t &n)
Stream the next generated number.
Definition: prng.h:121
void set_param(const std::vector< uint64_t > &v)
Set the generator's parameters.
Definition: prng.h:105
void seed(uint64_t seed)
Seed the PRNG.
Definition: prng.h:61
uint64_t operator()()
Generate a pseudorandom number.
Definition: prng.h:74
PRNG(pseudorandom_function p, uint64_t seed)
Construct a PRNG with the given generating algorithm and seed.
Definition: prng.h:50
static PRNG wyrand(uint64_t seed=1, uint64_t p1=2549536629329, uint64_t p2=136137137)
Returns a Wyrand generator.
Definition: prng.h:180
std::vector< uint64_t > get_param() const
Get the generator's parameters.
Definition: prng.h:115
void discard(uint64_t n)
Discard n numbers from the generator.
Definition: prng.h:81
pseudorandom_function get_function() const
Get the generating function.
Definition: prng.h:99
static PRNG xoshiro(uint64_t seed=1)
Returns a Xoshiro256++ generator.
Definition: prng.h:153
static PRNG xoshiro(const std::vector< uint64_t > &p)
Returns a Xoshiro256++ generator.
Definition: prng.h:142
static PRNG splitmix64(uint64_t seed=1)
Returns a Splitmix64 generator.
Definition: prng.h:170
void set_function(pseudorandom_function p)
Set the generating function.
Definition: prng.h:94
void set_param(unsigned int i, uint64_t value)
Set a specific parameter by index.
Definition: prng.h:110
PRNG(uint64_t seed)
Construct a PRNG with the default generator and the given seed.
Definition: prng.h:55
uint64_t next()
Generate a pseudorandom number.
Definition: prng.h:67
PRNG(pseudorandom_function p, const std::vector< uint64_t > &s)
Construct a PRNG with the given generating algorithm p and parameters s.
Definition: prng.h:44
PRNG(pseudorandom_function p, uint64_t seed, const std::vector< uint64_t > &s)
Construct a PRNG with the given generating algorithm p, seed x and parameters s.
Definition: prng.h:35
#define TH_MATH_ERROR(F_NAME, VALUE, EXCEPTION)
TH_MATH_ERROR is a macro which throws exceptions or modifies errno (depending on which compiling opti...
Definition: error.h:219
Main namespace of the library which contains all functions and objects.
Definition: algebra.h:27
uint64_t rand_splitmix64(uint64_t x)
Generate a pseudorandom number using the SplitMix64 pseudorandom number generation algorithm.
Definition: pseudorandom.h:130
uint64_t rand_wyrand(uint64_t &seed, uint64_t p1, uint64_t p2)
Generate a pseudorandom number using the Wyrand pseudorandom number generation, as invented by Yi Wan...
Definition: pseudorandom.h:160
void shuffle(Vector &v, PRNG &g, unsigned int rounds=0)
Shuffle a set by exchanging random couples of elements.
Definition: prng.h:215
uint64_t(*)(uint64_t, std::vector< uint64_t > &) pseudorandom_function
A function pointer which wraps a pseudorandom generator, taking as input the previous generated value...
Definition: pseudorandom.h:23
uint64_t rand_congruential(uint64_t x, uint64_t a=48271, uint64_t c=0, uint64_t m=((uint64_t) 1<< 31) - 1)
Generate a pseudorandom number using the congruential pseudorandom number generation algorithm.
Definition: pseudorandom.h:39
uint64_t rand_middlesquare(uint64_t seed, uint64_t offset=765872292751861)
Generate a pseudorandom number using the middle-square pseudorandom number generation algorithm.
Definition: pseudorandom.h:194
dual2 square(dual2 x)
Return the square of a second order dual number.
Definition: dual2_functions.h:23
uint64_t rand_xoshiro(uint64_t &a, uint64_t &b, uint64_t &c, uint64_t &d)
Generate a pseudorandom number using the xoshiro256++ pseudorandom number generation algorithm.
Definition: pseudorandom.h:86
Pseudorandom number generation algorithms.