#ifndef __RNG_H__ #define __RNG_H__ #include #include #include #include "fraction.h" // Technically, you should ONLY define one rng for the entire program // IMPORTANT: pass all RNG objects as references class RNG final { private: const unsigned int init_seed; int curr_rand_num; public: RNG(); // use time(0) as the seed RNG(const unsigned int seed); // use a seed int rand_num(); // returns a random number between 0 and RAND_MAX // IMPORTANT: all upper bounds are not included, all lower bounds are int rand_between(const int lower_bound, const int upper_bound); // returns a random number between 0 and upper_bound int rand_under(const int upper_bound); unsigned int get_init_seed() const; int get_curr_rand_num() const; bool trial(const fraction &psuccess); bool coin_flip(); int exclude_middle(const int lower_bound, const int upper_bound, const int excluded); template T rand_exclude(std::vector &vec, T &target) { std::size_t idx = 0; for (; idx < vec.size(); ++idx) if (vec[idx] == target) break; return vec[exclude_middle(0, vec.size(), idx)]; } template T get_rand_in_vector(std::vector &vec) { if (!vec.size()) return T{}; curr_rand_num = rand(); return vec[curr_rand_num % vec.size()]; } }; #endif