28 #ifndef OPENRAND_THREEFRY_H_
29 #define OPENRAND_THREEFRY_H_
31 #include <openrand/base_state.h>
42 OPENRAND_DEVICE
Threefry(uint64_t seed, uint32_t ctr,
43 uint32_t global_seed = openrand::DEFAULT_GLOBAL_SEED)
44 : seed(seed ^ global_seed), counter(ctr) {
47 template <
typename T = u
int32_t>
48 OPENRAND_DEVICE T draw() {
50 round(
static_cast<uint32_t
>(seed >> 32),
static_cast<uint32_t
>(seed),
51 counter, _ctr++, out);
53 static_assert(std::is_same_v<T, uint32_t> || std::is_same_v<T, uint64_t>);
54 if constexpr (std::is_same_v<T, uint32_t>)
59 (
static_cast<uint64_t
>(out[0]) << 32) |
static_cast<uint64_t
>(out[1]);
60 return static_cast<uint64_t
>(res);
65 OPENRAND_DEVICE uint32_t rotl32(uint32_t x, uint32_t N) {
66 return (x << (N & 31)) | (x >> ((32 - N) & 31));
69 OPENRAND_DEVICE
void round(uint32_t ks0, uint32_t ks1, uint32_t counter,
70 uint32_t _ctr, uint32_t* out) {
72 uint32_t ks2 = 0x1BD11BDA;
80 for (
int i = 0; i < 20; i++) {
82 x1 = rotl32(x1, get_constant(i % 8));
115 OPENRAND_DEVICE
int get_constant(
const int index)
const {
139 const uint32_t counter;
Base class for random number generators.
Definition: base_state.h:50
Definition: threefry.h:40