/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2015-2019 Danny Robson */ #pragma once #include "../std.hpp" #include #include namespace cruft::rand { /// linear congruential generator /// /// T: output/state type /// M: modulus /// A: multiplier /// C: increment template struct lcg { public: using result_type = T; static_assert (std::is_unsigned_v); explicit lcg (T seed); result_type operator() (void); static constexpr auto min (void) { return std::numeric_limits::min (); } static constexpr auto max (void) { return std::numeric_limits::max (); } void discard (unsigned); private: T m_x; }; // glibc: typedef lcg lcg_t; using lcg_t = lcg; }