6#include "TTauri/Foundation/math.hpp"
7#include "TTauri/Foundation/byte_string.hpp"
8#include "TTauri/Foundation/numeric_cast.hpp"
14inline bstring get_bytes(T &generator, ssize_t count)
16 decltype(generator()) random_number;
18 auto data = bstring(
static_cast<size_t>(count), std::byte{0});
21 while (i < count - ssizeof(random_number) - 1) {
22 random_number = generator();
23 for (
int j = 0; j <
sizeof(random_number); j++) {
24 data[i++] =
static_cast<std::byte
>(random_number);
29 random_number = generator();
31 data[i++] =
static_cast<std::byte
>(random_number);
40 static constexpr uint64_t multiplier = 6364136223846793005u;
41 static constexpr uint64_t increment = 1442695040888963407u;
46 pcg32(uint64_t seed = 0x4d595df4d0f33173) :
47 state(seed + increment)
52 uint32_t operator()() {
55 state = x * multiplier + increment;
57 ttlet count =
static_cast<unsigned int>(x >> 59);
60 return rotr(
static_cast<uint32_t
>(x >> 27), count);
64 return tt::get_bytes(*
this, count);
69 static constexpr uint64_t multiplier = 6364136223846793005u;
70 static constexpr uint64_t increment = 1442695040888963407u;
76 state(seed + increment)
81 uint32_t operator()() {
82 auto x = state.
load(std::memory_order_relaxed);
85 new_state = x * multiplier + increment;
88 ttlet count =
static_cast<unsigned int>(x >> 59);
91 return rotr(
static_cast<uint32_t
>(x >> 27), count);
95 return tt::get_bytes(*
this, count);
Definition random_pcg.hpp:39
Definition random_pcg.hpp:68
T compare_exchange_weak(T... args)