From a61fc1060207f2e0edbe30d892213916bfa91f49 Mon Sep 17 00:00:00 2001 From: LoRd_MuldeR Date: Sat, 20 Oct 2018 21:05:39 +0200 Subject: [PATCH] Added an overload of next_rand_u32() that generates a random number in [0,N) range. --- include/MUtils/Global.h | 3 ++- src/Global.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/MUtils/Global.h b/include/MUtils/Global.h index 27b709d..67fd48d 100644 --- a/include/MUtils/Global.h +++ b/include/MUtils/Global.h @@ -124,7 +124,8 @@ namespace MUtils * \return The function returns a *random* unsigned 32-Bit value. */ MUTILS_API quint32 next_rand_u32(void); - + MUTILS_API quint32 next_rand_u32(const quint32 max); + /** * \brief Generates a *random* unsigned 64-Bit value. * diff --git a/src/Global.cpp b/src/Global.cpp index 9177c35..20d9402 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -122,6 +122,23 @@ quint32 MUtils::next_rand_u32(void) return rnd; } +quint32 MUtils::next_rand_u32(const quint32 max) +{ + static const uint32_t DIV_LUT[64] = + { + 0xFFFFFFFF, 0xFFFFFFFF, 0x80000000, 0x55555556, 0x40000000, 0x33333334, 0x2AAAAAAB, 0x24924925, + 0x20000000, 0x1C71C71D, 0x1999999A, 0x1745D175, 0x15555556, 0x13B13B14, 0x12492493, 0x11111112, + 0x10000000, 0x0F0F0F10, 0x0E38E38F, 0x0D79435F, 0x0CCCCCCD, 0x0C30C30D, 0x0BA2E8BB, 0x0B21642D, + 0x0AAAAAAB, 0x0A3D70A4, 0x09D89D8A, 0x097B425F, 0x0924924A, 0x08D3DCB1, 0x08888889, 0x08421085, + 0x08000000, 0x07C1F07D, 0x07878788, 0x07507508, 0x071C71C8, 0x06EB3E46, 0x06BCA1B0, 0x06906907, + 0x06666667, 0x063E7064, 0x06186187, 0x05F417D1, 0x05D1745E, 0x05B05B06, 0x0590B217, 0x0572620B, + 0x05555556, 0x0539782A, 0x051EB852, 0x05050506, 0x04EC4EC5, 0x04D4873F, 0x04BDA130, 0x04A7904B, + 0x04924925, 0x047DC120, 0x0469EE59, 0x0456C798, 0x04444445, 0x04325C54, 0x04210843, 0x04104105 + }; + return (max < 64) ? (next_rand_u32() / DIV_LUT[max]) : (next_rand_u32() / (UINT32_MAX / max + 1U)); +} + + quint64 MUtils::next_rand_u64(void) { return (quint64(next_rand_u32()) << 32) | quint64(next_rand_u32());