From 747bf5bf77512daeac551a762f6a7669769f6ca1 Mon Sep 17 00:00:00 2001 From: Josef 'Jeff' Sipek Date: Mon, 18 Sep 2017 13:55:08 +0300 Subject: [PATCH] lib: introduce i_rand_limit() and i_rand_minmax() --- src/lib/lib.h | 9 +++++++++ src/lib/rand.c | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/lib/lib.h b/src/lib/lib.h index e795101e4d..a02fbb1f7c 100644 --- a/src/lib/lib.h +++ b/src/lib/lib.h @@ -90,5 +90,14 @@ bool lib_is_initialized(void); void lib_deinit(void); uint32_t i_rand(void); +/* Returns a random integer < upper_bound. */ +uint32_t i_rand_limit(uint32_t upper_bound); + +/* Returns a random integer >= min_val, and <= max_val. */ +static inline uint32_t i_rand_minmax(uint32_t min_val, uint32_t max_val) +{ + i_assert(min_val <= max_val); + return min_val + i_rand_limit(max_val - min_val + 1); +} #endif diff --git a/src/lib/rand.c b/src/lib/rand.c index 781a38f6bc..e9f3cfad7a 100644 --- a/src/lib/rand.c +++ b/src/lib/rand.c @@ -12,6 +12,11 @@ uint32_t i_rand(void) { return arc4random(); } + +uint32_t i_rand_limit(uint32_t upper_bound) +{ + return arc4random_uniform(upper_bound); +} #else uint32_t i_rand(void) { @@ -19,4 +24,10 @@ uint32_t i_rand(void) random_fill(&value, sizeof(value)); return value; } + +uint32_t i_rand_limit(uint32_t upper_bound) +{ + /* FIXME: This simple implementation suffers from modulo-bias. */ + return i_rand() % upper_bound; +} #endif -- 2.47.3