aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2015-08-11 19:07:56 +0200
committerest31 <MTest31@outlook.com>2015-08-12 11:36:22 +0200
commit738fbc66d096575bb9a1694056ce2d627a70c03d (patch)
treebdc56e4dc74cac201154176d02e32d57c6ab6958 /src
parentf0b325254fdf76f988f0d2ae83a8aa6825b6d60e (diff)
downloadminetest-738fbc66d096575bb9a1694056ce2d627a70c03d.tar.gz
minetest-738fbc66d096575bb9a1694056ce2d627a70c03d.tar.bz2
minetest-738fbc66d096575bb9a1694056ce2d627a70c03d.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/noise.cpp3
-rw-r--r--src/unittest/test_random.cpp3
2 files changed, 6 insertions, 0 deletions
diff --git a/src/noise.cpp b/src/noise.cpp
index 443c405ce..2948fb765 100644
--- a/src/noise.cpp
+++ b/src/noise.cpp
@@ -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.
diff --git a/src/unittest/test_random.cpp b/src/unittest/test_random.cpp
index 20cfca334..bbee57719 100644
--- a/src/unittest/test_random.cpp
+++ b/src/unittest/test_random.cpp
@@ -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;