Fix Lua PcgRandom
authorest31 <MTest31@outlook.com>
Tue, 11 Aug 2015 17:07:56 +0000 (19:07 +0200)
committerest31 <MTest31@outlook.com>
Wed, 12 Aug 2015 09:36:22 +0000 (11:36 +0200)
Before, this lua code led to a crash:

local pcg = PcgRandom(42)
local value = pcg:next()

This was because if you called s32 PcgRandom::range(min, max) with the
minimum and maximum possible values for s32 integers (which the lua
binding code did), u32 PcgRandom::range(bound) got called with 0 as the
bound. The bound however is one above the maximum value, so 0 is a "special"
value to pass to this function. This commit fixes the lua crash by
assigning the RNG's full range to the bound 0, which is also fits to the
"maximum is bound - 1" principle, as (u32)-1 is the maximum value in the
u32 range.

src/noise.cpp
src/unittest/test_random.cpp

index 443c405cec8030a88a1b0b2175b26b3761356e09..2948fb765c509fb424fec0496f27b53e1d641d4c 100644 (file)
@@ -90,6 +90,9 @@ u32 PcgRandom::next()
 
 u32 PcgRandom::range(u32 bound)
 {
+       // If the bound is 0, we cover the whole RNG's range
+       if (bound == 0)
+               return next();
        /*
        If the bound is not a multiple of the RNG's range, it may cause bias,
        e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2.
index 20cfca3343cfefc2f7b97d5ebf327442eb9167d0..bbee577193d90275ee1b412f3df1247fb63e4462 100644 (file)
@@ -101,6 +101,9 @@ void TestRandom::testPcgRandomRange()
 
        EXCEPTION_CHECK(PrngException, pr.range(5, 1));
 
+       // Regression test for bug 3027
+       pr.range(pr.RANDOM_MIN, pr.RANDOM_MAX);
+
        for (u32 i = 0; i != 32768; i++) {
                int min = (pr.next() % 3000) - 500;
                int max = (pr.next() % 3000) - 500;