28 #ifndef OPENRAND_TYCHE_H_
29 #define OPENRAND_TYCHE_H_
31 #include <openrand/base_state.h>
38 inline OPENRAND_DEVICE uint32_t rotl(uint32_t value,
unsigned int x) {
39 return (value << x) | (value >> (32 - x));
47 OPENRAND_DEVICE
Tyche(uint64_t seed, uint32_t ctr,
48 uint32_t global_seed = openrand::DEFAULT_GLOBAL_SEED) {
49 seed = seed ^ global_seed;
50 a =
static_cast<uint32_t
>(seed >> 32);
51 b =
static_cast<uint32_t
>(seed & 0xFFFFFFFFULL);
54 for (
int i = 0; i < 20; i++) {
59 template <
typename T = u
int32_t>
60 OPENRAND_DEVICE T draw() {
62 if constexpr (std::is_same_v<T, uint32_t>)
68 uint64_t res = (
static_cast<uint64_t
>(tmp) << 32) | a;
69 return static_cast<T
>(res);
85 inline OPENRAND_DEVICE
void mix() {
97 uint32_t c = 2654435769;
98 uint32_t d = 1367130551;
Base class for random number generators.
Definition: base_state.h:50