From c812c92d1a1835f0bda783e709481188c8d92225 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sat, 15 Mar 2014 19:34:59 -0700 Subject: Clean up header organization --- src/generic/random.hpp | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/generic/random.hpp (limited to 'src/generic/random.hpp') diff --git a/src/generic/random.hpp b/src/generic/random.hpp new file mode 100644 index 0000000..5d7a7af --- /dev/null +++ b/src/generic/random.hpp @@ -0,0 +1,69 @@ +#ifndef TMWA_GENERIC_RANDOM_HPP +#define TMWA_GENERIC_RANDOM_HPP + +# include "random.t.hpp" + +# include "../sanity.hpp" + +# include + +// This is not namespace random since that collides with a C function, +// but this can be revisited when everything goes into namespace tmwa. +namespace random_ +{ + /// Get a random number from 0 .. 2**32 - 1 + extern std::mt19937 generate; + + /// Get a random number from 0 .. bound - 1 + inline + int to(int bound) + { + std::uniform_int_distribution dist(0, bound - 1); + return dist(generate); + } + + /// Get a random number from low .. high (inclusive!) + inline + int in(int low, int high) + { + std::uniform_int_distribution dist(low, high); + return dist(generate); + } + + inline + bool coin() + { + // sigh, can't specify directly ... + std::uniform_int_distribution dist(false, true); + return dist(generate); + } + + inline + bool chance(Fraction f) + { + if (f.num <= 0) + return false; + if (f.num >= f.den) + return true; + return random_::to(f.den) < f.num; + } + + // C is usually one of: + // std::vector + // std::initializer_list + // std::array + template + auto choice(C&& c) -> decltype(*c.begin()) + { + return *(c.begin() + random_::to(c.size())); + } + + // allow bare braces + template + T choice(std::initializer_list&& il) + { + return random_::choice(il); + } +} // namespace random_ + +#endif // TMWA_GENERIC_RANDOM_HPP -- cgit v1.2.3-70-g09d2