Throw exception if RNG is used with invalid bounds.
This commit is contained in:
parent
9a20e5e2e2
commit
4eb845d438
2 changed files with 20 additions and 7 deletions
|
@ -1,6 +1,7 @@
|
||||||
#include "rng_sfmt.h"
|
#include "rng_sfmt.h"
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
// This is from gcc sources, namely from fixincludes/inclhack.def
|
// This is from gcc sources, namely from fixincludes/inclhack.def
|
||||||
// On C++11 systems, <cstdint> could be included instead.
|
// On C++11 systems, <cstdint> could be included instead.
|
||||||
|
@ -57,12 +58,17 @@ RNG_SFMT::RNG_SFMT(QObject *parent)
|
||||||
*/
|
*/
|
||||||
unsigned int RNG_SFMT::getNumber(unsigned int min, unsigned int max)
|
unsigned int RNG_SFMT::getNumber(unsigned int min, unsigned int max)
|
||||||
{
|
{
|
||||||
// This all makes no sense if min > max.
|
// This all makes no sense if min > max, which should never happen.
|
||||||
// So in debug mode Q_ASSERT will print a warning...
|
if(min > max) {
|
||||||
Q_ASSERT(min <= max);
|
throw std::invalid_argument(
|
||||||
// ... and at runtime min and max will be swapped; this should never happen.
|
QString("Invalid bounds for RNG: min > max! Values were: min = " +
|
||||||
if(min > max)
|
QString::number(min) + ", max = " +
|
||||||
std::swap(min, max);
|
QString::number(max) +
|
||||||
|
". This is either a bug or something even more serious happened."
|
||||||
|
).toStdString());
|
||||||
|
// at this point, the method exits. No return value is needed, because
|
||||||
|
// basically the exception itself is returned.
|
||||||
|
}
|
||||||
|
|
||||||
// First compute the diameter (aka size, length) of the [min, max] interval
|
// First compute the diameter (aka size, length) of the [min, max] interval
|
||||||
const unsigned int diameter = max - min + 1;
|
const unsigned int diameter = max - min + 1;
|
||||||
|
|
|
@ -7,7 +7,14 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class represents the random number generator.
|
* This class represents the random number generator.
|
||||||
* It uses the SIMD-oriented Fast Mersenne Twister code v1.4.1 from
|
* Usage instructions:
|
||||||
|
* Create an instance of RNG_SFMT, then call getNumber(min, max).
|
||||||
|
* You should never call this function with min > max, this throws a
|
||||||
|
* std::invalid_argument exception. It is best practice to use getNumber() in a try block
|
||||||
|
* and catch the exception if min, max are entered by the user or computed somehow.
|
||||||
|
*
|
||||||
|
* Technical details:
|
||||||
|
* The RNG uses the SIMD-oriented Fast Mersenne Twister code v1.4.1 from
|
||||||
* http://www.math.sci.hiroshima-u.ac.jp/~%20m-mat/MT/SFMT/index.html
|
* http://www.math.sci.hiroshima-u.ac.jp/~%20m-mat/MT/SFMT/index.html
|
||||||
* To use this RNG, the class needs a sfmt_t structure for the RNG's internal state.
|
* To use this RNG, the class needs a sfmt_t structure for the RNG's internal state.
|
||||||
* It has to be initialized by sfmt_init_gen_rand() which is done in the constructor.
|
* It has to be initialized by sfmt_init_gen_rand() which is done in the constructor.
|
||||||
|
|
Loading…
Reference in a new issue