Replace PRNG assertions with PrngException

master
kwolekr 2015-04-27 01:24:37 -04:00
parent 732eb72a0c
commit cd1d625ab2
3 changed files with 13 additions and 4 deletions

View File

@ -120,6 +120,11 @@ public:
ClientStateError(std::string s): BaseException(s) {}
};
class PrngException : public BaseException {
public:
PrngException(std::string s): BaseException(s) {}
};
/*
Some "old-style" interrupts:
*/

View File

@ -115,7 +115,9 @@ u32 PcgRandom::range(u32 bound)
s32 PcgRandom::range(s32 min, s32 max)
{
assert(max >= min);
if (max < min)
throw PrngException("Invalid range (max < min)");
u32 bound = max - min + 1;
return range(bound) + min;
}

View File

@ -26,8 +26,8 @@
#ifndef NOISE_HEADER
#define NOISE_HEADER
#include "debug.h"
#include "irr_v3d.h"
#include "exceptions.h"
#include "util/string.h"
extern FlagDesc flagdesc_noiseparams[];
@ -56,14 +56,16 @@ public:
inline int range(int min, int max)
{
assert(max >= min);
if (max < min)
throw PrngException("Invalid range (max < min)");
/*
Here, we ensure the range is not too large relative to RANDOM_MAX,
as otherwise the effects of bias would become noticable. Unlike
PcgRandom, we cannot modify this RNG's range as it would change the
output of this RNG for reverse compatibility.
*/
assert((u32)(max - min) <= (RANDOM_RANGE + 1) / 10);
if ((u32)(max - min) > (RANDOM_RANGE + 1) / 10)
throw PrngException("Range too large");
return (next() % (max - min + 1)) + min;
}