18 [[nodiscard]]
constexpr uint64_t seeded_noise64(uint64_t position, uint64_t seed)
20 const uint64_t BIT_NOISE1 = 0xB5297A4DB5297A4D;
21 const uint64_t BIT_NOISE2 = 0x68E31DA468E31DA4;
22 const uint64_t BIT_NOISE3 = 0x1B56C4E91B56C4E9;
24 uint64_t mangled = position;
25 mangled *= BIT_NOISE1;
27 mangled ^= (mangled >> 8);
28 mangled += BIT_NOISE2;
29 mangled ^= (mangled << 8);
30 mangled *= BIT_NOISE3;
31 mangled ^= (mangled >> 8);
35 [[nodiscard]]
constexpr uint32_t seeded_noise(int32_t position, uint32_t seed)
37 constexpr uint32_t SQ5_BIT_NOISE1 = 0xd2a80a3f;
38 constexpr uint32_t SQ5_BIT_NOISE2 = 0xa884f197;
39 constexpr uint32_t SQ5_BIT_NOISE3 = 0x6C736F4B;
40 constexpr uint32_t SQ5_BIT_NOISE4 = 0xB79F3ABB;
41 constexpr uint32_t SQ5_BIT_NOISE5 = 0x1b56c4f5;
43 auto mangledBits = (uint32_t)position;
44 mangledBits *= SQ5_BIT_NOISE1;
46 mangledBits ^= (mangledBits >> 9);
47 mangledBits += SQ5_BIT_NOISE2;
48 mangledBits ^= (mangledBits >> 11);
49 mangledBits *= SQ5_BIT_NOISE3;
50 mangledBits ^= (mangledBits >> 13);
51 mangledBits += SQ5_BIT_NOISE4;
52 mangledBits ^= (mangledBits >> 15);
53 mangledBits *= SQ5_BIT_NOISE5;
54 mangledBits ^= (mangledBits >> 17);
58 [[nodiscard]]
constexpr uint32_t seeded_noise2d(int32_t indexX, int32_t indexY, uint32_t seed)
60 constexpr int PRIME_NUMBER = 198491317;
61 return seeded_noise(indexX + (PRIME_NUMBER * indexY), seed);
64 [[nodiscard]]
constexpr double seeded_noise_normalized(int32_t index, uint32_t seed)
66 constexpr double ONE_OVER_MAX_UINT = (1.0 / (double)0xFFFFFFFF);
67 return ONE_OVER_MAX_UINT * (double)seeded_noise(index, seed);
70 [[nodiscard]]
constexpr double seeded_noise2d_normalized(int32_t indexX, int32_t indexY, uint32_t seed)
72 constexpr double ONE_OVER_MAX_UINT = (1.0 / (double)0xFFFFFFFF);
73 return ONE_OVER_MAX_UINT * (double)seeded_noise2d(indexX, indexY, seed);
79 constexpr uint64_t xorshift64(uint64_t& state)
noexcept
86 return x * 0x2545F4914F6CDD1D;
89 constexpr inline uint64_t numrep_hash(uint64_t
index)
91 uint64_t v =
index * 3935559000370003845LL + 2691343689449507681LL;
92 v ^= v >> 21; v ^= v << 37; v ^= v >> 4;
93 v *= 4768777513237032717LL;
94 v ^= v << 20; v ^= v >> 41; v ^= v << 5;
121 constexpr uint64_t philox64(uint64_t sequence_index, uint32_t sequence_key)
123 constexpr auto _philox2x32round = [](std::pair<uint32_t, uint32_t> ctr, uint32_t key) -> std::pair<uint32_t, uint32_t> {
124 uint64_t product = (((uint64_t)0xd256d193)) * ctr.first;
125 uint32_t hi = (uint32_t)(product >> 32);
126 uint32_t lo = (uint32_t)product;
127 return { hi ^ key ^ ctr.second, lo };
129 auto ctrPair = std::pair<uint32_t, uint32_t>{ (uint32_t)sequence_index, (uint32_t)(sequence_index >> 32) };
130 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
131 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
132 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
133 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
134 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
135 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
136 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
137 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
138 ctrPair = _philox2x32round(ctrPair, sequence_key); sequence_key += ((uint32_t)0x9E3779B9);
139 ctrPair = _philox2x32round(ctrPair, sequence_key);
140 return uint64_t(ctrPair.first) | (uint64_t(ctrPair.second) << 32ULL);
144 struct philox64_engine
146 using result_type = uint64_t;
148 [[nodiscard]]
constexpr result_type operator()()
noexcept {
return philox64(m_index + n++, m_key); }
149 constexpr philox64_engine(uint64_t index = 0, uint32_t key = 0) noexcept : m_index(index), m_key(key), n(0) { }
151 static constexpr result_type min() {
return 0; }
152 static constexpr result_type max() {
return ~((result_type)0); }
154 [[nodiscard]]
constexpr uint64_t index()
const noexcept {
return m_index; }
155 [[nodiscard]]
constexpr uint32_t key()
const noexcept {
return m_key; }
156 constexpr void reset(uint64_t index, uint32_t key)
noexcept
169 static_assert(std::uniform_random_bit_generator<philox64_engine>);
auto index(T &cont, RANDOM &rng=::ghassanpl::random::default_random_engine)
Returns an index of a random element in cont.
Shamelessly stolen from https://github.com/SRombauts/SimplexNoise/.