30 x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9ULL;
31 x = (x ^ (x >> 27)) * 0x94d049bb133111ebULL;
37 std::uint64_t stream_id,
38 std::uint64_t thread_id)
40 constexpr std::uint64_t GOLDEN = 0x9e3779b97f4a7c15ULL;
42 std::uint64_t combined = base_seed;
56 std::uint32_t data[8];
58 std::uint64_t x = seed;
59 for (
int i = 0; i < 8; ++i) {
61 data[i] =
static_cast<std::uint32_t
>(x & 0xFFFFFFFFULL);
64 std::seed_seq seq(std::begin(data), std::end(data));
65 return std::mt19937(seq);
71 const std::uint64_t base =
static_cast<std::uint64_t
>(
get_global_seed());
77 const std::uint64_t base =
static_cast<std::uint64_t
>(
get_global_seed());
79 std::uint64_t tid = 0ULL;
81 tid =
static_cast<std::uint64_t
>(omp_get_thread_num());
89 std::uint64_t stream_id)
91 const std::uint64_t base = base_seed.has_value()
92 ?
static_cast<std::uint64_t
>(*base_seed)
std::uint64_t combine_seeds(std::uint64_t base_seed, std::uint64_t stream_id, std::uint64_t thread_id)
std::mt19937 create_mt19937(std::uint64_t seed)
Create mt19937 from a 64-bit seed.
std::uint64_t splitmix64_mix(std::uint64_t x)
std::mt19937 make_thread_engine(std::uint64_t stream_id)
Create a deterministic RNG engine for the current thread (OpenMP if available)
std::mt19937 make_engine_with_seed(std::optional< std::uint32_t > base_seed, std::uint64_t stream_id)
Create a deterministic RNG engine with explicit seed override (optional)
std::mt19937 make_engine(std::uint64_t stream_id)
Create a deterministic RNG engine for a specific stream.
std::uint32_t get_global_seed()
Get the current global seed.
Factory for creating deterministic, independent RNG engines.