/* * 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 */ #ifndef __UTIL_RAND_LCG_HPP #define __UTIL_RAND_LCG_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::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 lcg_t; using lcg_t = lcg; } #endif