Fix Lua PcgRandom

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.
master
est31 2015-08-11 19:07:56 +02:00
parent f0b325254f
commit 738fbc66d0
2 changed files with 6 additions and 0 deletions

View File

@ -90,6 +90,9 @@ u32 PcgRandom::next()
u32 PcgRandom::range(u32 bound) 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, 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. e.g. a RNG has a range from 0 to 3 and we take want a number 0 to 2.

View File

@ -101,6 +101,9 @@ void TestRandom::testPcgRandomRange()
EXCEPTION_CHECK(PrngException, pr.range(5, 1)); 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++) { for (u32 i = 0; i != 32768; i++) {
int min = (pr.next() % 3000) - 500; int min = (pr.next() % 3000) - 500;
int max = (pr.next() % 3000) - 500; int max = (pr.next() % 3000) - 500;