OSDN Git Service

Added an overload of next_rand_u32() that generates a random number in [0,N) range.
authorLoRd_MuldeR <mulder2@gmx.de>
Sat, 20 Oct 2018 19:05:39 +0000 (21:05 +0200)
committerLoRd_MuldeR <mulder2@gmx.de>
Sat, 20 Oct 2018 19:05:39 +0000 (21:05 +0200)
include/MUtils/Global.h
src/Global.cpp

index 27b709d..67fd48d 100644 (file)
@@ -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.
        *
index 9177c35..20d9402 100644 (file)
@@ -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());