Iros
 
Loading...
Searching...
No Matches
linear_congruential_engine.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/language.h"
4#include "di/types/prelude.h"
5
6namespace di::random {
7template<concepts::UnsignedInteger T, T a, T c, T m>
9public:
10 using Result = T;
11
12 constexpr static auto multiplier = a;
13 constexpr static auto increment = c;
14 constexpr static auto modulus = m;
15 constexpr static T default_seed = 1U;
16
17 constexpr static auto min() -> T { return increment == 0U ? 1U : 0U; }
18 constexpr static auto max() -> T { return modulus - 1U; }
19
20private:
21 constexpr auto safe_modulo(T value) -> T {
22 if constexpr (modulus == 0U) {
23 return value;
24 } else {
25 return value % modulus;
26 }
27 }
28
29public:
31
32 constexpr explicit LinearCongruentialEngine(T seed) { this->seed(seed); }
33
34 constexpr void seed(T seed = default_seed) {
35 if (safe_modulo(increment) == 0 && safe_modulo(seed) == 0) {
36 m_state = 1U;
37 } else {
38 m_state = safe_modulo(seed);
39 }
40 }
41
42 constexpr auto operator()() -> T {
43 if constexpr (multiplier == 0) {
44 return safe_modulo(increment);
45 } else {
46 return m_state = safe_modulo(multiplier * m_state + increment);
47 }
48 }
49
50 constexpr void discard(umax z) {
51 for (; z != 0U; z--) {
52 (*this)();
53 }
54 }
55
56private:
57 constexpr friend auto operator==(LinearCongruentialEngine const& x, LinearCongruentialEngine const& y) -> bool {
58 return x.m_state == y.m_state;
59 }
60
61 T m_state;
62};
63
66}
67
68namespace di {
72}
Definition linear_congruential_engine.h:8
static constexpr auto multiplier
Definition linear_congruential_engine.h:12
static constexpr auto max() -> T
Definition linear_congruential_engine.h:18
static constexpr auto modulus
Definition linear_congruential_engine.h:14
static constexpr auto increment
Definition linear_congruential_engine.h:13
constexpr void discard(umax z)
Definition linear_congruential_engine.h:50
T Result
Definition linear_congruential_engine.h:10
constexpr LinearCongruentialEngine(T seed)
Definition linear_congruential_engine.h:32
constexpr friend auto operator==(LinearCongruentialEngine const &x, LinearCongruentialEngine const &y) -> bool
Definition linear_congruential_engine.h:57
static constexpr auto min() -> T
Definition linear_congruential_engine.h:17
constexpr auto operator()() -> T
Definition linear_congruential_engine.h:42
constexpr void seed(T seed=default_seed)
Definition linear_congruential_engine.h:34
constexpr LinearCongruentialEngine()
Definition linear_congruential_engine.h:30
static constexpr T default_seed
Definition linear_congruential_engine.h:15
Definition uniform_int_distribution.h:8
LinearCongruentialEngine< u32, 48271, 0, 2147483647 > MinstdRand
Definition linear_congruential_engine.h:65
LinearCongruentialEngine< u32, 16807, 0, 2147483647 > MinstdRand0
Definition linear_congruential_engine.h:64
uintmax_t umax
Definition integers.h:39
Definition zstring_parser.h:9