From 83aba92c420408b0e20e2c27436f6af97c0e4f19 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 23 Sep 2020 11:00:19 +0300 Subject: [PATCH] Add PCG32 generator to pcg --- .../include/psemek/pcg/random/generator.hpp | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 libs/pcg/include/psemek/pcg/random/generator.hpp diff --git a/libs/pcg/include/psemek/pcg/random/generator.hpp b/libs/pcg/include/psemek/pcg/random/generator.hpp new file mode 100644 index 00000000..3d58e9d1 --- /dev/null +++ b/libs/pcg/include/psemek/pcg/random/generator.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include +#include + +namespace psemek::pcg +{ + + // based on www.pcg-random.org + struct generator + { + generator() = default; + generator(generator const &) = default; + + generator(std::uint64_t state, std::uint64_t inc) + : state_{state} + , inc_{inc} + {} + + template + generator(RD && rd, std::uint64_t inc) + : state_{gen64(rd)} + , inc_{inc} + {} + + template + generator(RD && rd) + : state_{gen64(rd)} + , inc_{gen64(rd)} + {} + + generator & operator = (generator const &) = default; + + using result_type = std::uint32_t; + + result_type operator()() + { + std::uint64_t oldstate = state_; + state_ = oldstate * 6364136223846793005ULL + (inc_ | 1); + std::uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; + std::uint32_t rot = oldstate >> 59u; + return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); + } + + static result_type min() + { + return 0; + } + + static result_type max() + { + return std::numeric_limits::max(); + } + + private: + std::uint64_t state_; + std::uint64_t inc_; + + template + static std::uint64_t gen64(RD & rd) + { + return (static_cast(rd()) << 32) | rd(); + } + }; + +}