Add PCG32 generator to pcg
This commit is contained in:
parent
06916083bb
commit
83aba92c42
1 changed files with 66 additions and 0 deletions
66
libs/pcg/include/psemek/pcg/random/generator.hpp
Normal file
66
libs/pcg/include/psemek/pcg/random/generator.hpp
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
|
||||
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 <typename RD>
|
||||
generator(RD && rd, std::uint64_t inc)
|
||||
: state_{gen64(rd)}
|
||||
, inc_{inc}
|
||||
{}
|
||||
|
||||
template <typename RD>
|
||||
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<result_type>::max();
|
||||
}
|
||||
|
||||
private:
|
||||
std::uint64_t state_;
|
||||
std::uint64_t inc_;
|
||||
|
||||
template <typename RD>
|
||||
static std::uint64_t gen64(RD & rd)
|
||||
{
|
||||
return (static_cast<std::uint64_t>(rd()) << 32) | rd();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue