/* * 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 Danny Robson <danny@nerdcruft.net> */ #ifndef __UTIL_RAND_LCG_HPP #define __UTIL_RAND_LCG_HPP #include <cstdint> #include <type_traits> namespace cruft::rand { /// linear congruential generator /// /// T: output/state type /// M: modulus /// A: multiplier /// C: increment template <typename T, T M, T A, T C> struct lcg { public: using result_type = T; static_assert (std::is_unsigned<T>::value, "LCG generates integer overflow which is undefined behaviour for signed types"); explicit lcg (T seed); result_type operator() (void); static result_type min (void); static result_type max (void); void discard (unsigned); private: T m_x; }; // glibc: typedef lcg<uint32_t, pow2(31), 1103515245, 12345> lcg_t; using lcg_t = lcg<uint64_t,0u,6364136223846793005ul, 1ul>; } #endif