#include #include "random.h" using namespace std; static mt19937_64 rng; // XXX: could substitute a cryptographic RNG void random_seed(bigint seed) { rng.seed(seed); } static uniform_int_distribution choose_bit(0,1); bool random_bool(void) { return choose_bit(rng); } static uniform_int_distribution choose_int( numeric_limits::min(), numeric_limits::max() ); int random_int(void) { return choose_int(rng); } static uniform_int_distribution choose_uint( numeric_limits::min(), numeric_limits::max() ); unsigned int random_uint(void) { return choose_uint(rng); } static uniform_int_distribution choose_long( numeric_limits::min(), numeric_limits::max() ); long random_long(void) { return choose_long(rng); } static uniform_int_distribution choose_ulong( numeric_limits::min(), numeric_limits::max() ); unsigned long random_ulong(void) { return choose_ulong(rng); } static uniform_int_distribution choose_longlong( numeric_limits::min(), numeric_limits::max() ); long long random_longlong(void) { return choose_longlong(rng); } static uniform_int_distribution choose_ulonglong( numeric_limits::min(), numeric_limits::max() ); unsigned long long random_ulonglong(void) { return choose_ulonglong(rng); } bigint random_bigint_below(const bigint &m) { // XXX: handle larger ranges bigint result = random_longlong(); return result%m; }