From 8f436d3de7e99268a8862664d2cb2574231c3b18 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Fri, 3 Oct 2014 17:12:23 +0100 Subject: use comphelper::rng::uniform_*_distribution everywhere and automatically seed from time on first use coverity#1242393 Don't call rand coverity#1242404 Don't call rand coverity#1242410 Don't call rand and additionally allow 0xFF as a value coverity#1242409 Don't call rand coverity#1242399 Don't call rand coverity#1242372 Don't call rand coverity#1242377 Don't call rand coverity#1242378 Don't call rand coverity#1242379 Don't call rand coverity#1242382 Don't call rand coverity#1242383 Don't call rand coverity#1242402 Don't call rand coverity#1242397 Don't call rand coverity#1242390 Don't call rand coverity#1242389 Don't call rand coverity#1242388 Don't call rand coverity#1242386 Don't call rand coverity#1242384 Don't call rand coverity#1242394 Don't call rand Change-Id: I241feab9cb370e091fd6ccaba2af941eb95bc7cf --- comphelper/source/misc/random.cxx | 58 ++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 13 deletions(-) (limited to 'comphelper') diff --git a/comphelper/source/misc/random.cxx b/comphelper/source/misc/random.cxx index a97608649bbf..4fb4a1fde08d 100644 --- a/comphelper/source/misc/random.cxx +++ b/comphelper/source/misc/random.cxx @@ -11,8 +11,8 @@ */ #include - #include +#include // this is nothing but a simple wrapper around // the boost random generators @@ -29,23 +29,55 @@ namespace rng // memory requirement: 625*sizeof(uint32_t) // http://en.wikipedia.org/wiki/Mersenne_twister #define BOOST_RNG_ALGO boost::mt19937 -BOOST_RNG_ALGO global_rng; -// initialises the state of the global random number generator -// should only be called once at the start of the main programme -// (note, a few boost::variate_generator<> (like normal) have their -// own state which would need a reset as well to guarantee identical -// sequence of numbers, e.g. via myrand.distribution().reset()) -void seed(int i) +struct RandomNumberGenerator +{ + BOOST_RNG_ALGO global_rng; + RandomNumberGenerator() + { + // initialises the state of the global random number generator + // should only be called once. + // (note, a few boost::variate_generator<> (like normal) have their + // own state which would need a reset as well to guarantee identical + // sequence of numbers, e.g. via myrand.distribution().reset()) + global_rng.seed(time(NULL)); + } +}; + +class theRandomNumberGenerator : public rtl::Static {}; + +// re-initialises the state of the global random number generator +void reseed(int i) +{ + return theRandomNumberGenerator::get().global_rng.seed(i); +} + +// uniform ints [a,b] distribution +int uniform_int_distribution(int a, int b) +{ + boost::random::uniform_int_distribution dist(a, b); + return dist(theRandomNumberGenerator::get().global_rng); +} + +// uniform ints [a,b] distribution +unsigned int uniform_int_distribution(unsigned int a, unsigned int b) +{ + boost::random::uniform_int_distribution dist(a, b); + return dist(theRandomNumberGenerator::get().global_rng); +} + +// uniform size_t [a,b] distribution +size_t uniform_int_distribution(size_t a, size_t b) { - global_rng.seed(i); + boost::random::uniform_int_distribution dist(a, b); + return dist(theRandomNumberGenerator::get().global_rng); } -// uniform [0,1) or [a,b) distribution -double uniform() +// uniform size_t [a,b) distribution +double uniform_real_distribution(double a, double b) { - static boost::uniform_01 myrand(global_rng); - return myrand(); + boost::random::uniform_real_distribution dist(a, b); + return dist(theRandomNumberGenerator::get().global_rng); } } // namespace -- cgit