From b93bf95f2e76eca8be12ba07828387ab8529c050 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 9 Nov 2019 13:32:58 +0100 Subject: Core/Random: Refactor random number generation to use std::uniform_*_distribution to restrict result range instead of doing that ourselves * Seed SFMTRand with more values for its state (cherry picked from commit 73bc3d8ea49a4793b14976e86010a36f19c1d18b) --- src/common/Utilities/Random.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'src/common/Utilities/Random.cpp') diff --git a/src/common/Utilities/Random.cpp b/src/common/Utilities/Random.cpp index 974f13db0be..5a4004b41bd 100644 --- a/src/common/Utilities/Random.cpp +++ b/src/common/Utilities/Random.cpp @@ -22,7 +22,7 @@ #include static boost::thread_specific_ptr sfmtRand; -static SFMTEngine engine; +static RandomEngine engine; static SFMTRand* GetRng() { @@ -40,26 +40,28 @@ static SFMTRand* GetRng() int32 irand(int32 min, int32 max) { ASSERT(max >= min); - return int32(GetRng()->IRandom(min, max)); + std::uniform_int_distribution uid(min, max); + return uid(engine); } uint32 urand(uint32 min, uint32 max) { ASSERT(max >= min); - return GetRng()->URandom(min, max); + std::uniform_int_distribution uid(min, max); + return uid(engine); } uint32 urandms(uint32 min, uint32 max) { - ASSERT(max >= min); ASSERT(std::numeric_limits::max() / Milliseconds::period::den >= max); - return GetRng()->URandom(min * Milliseconds::period::den, max * Milliseconds::period::den); + return urand(min * Milliseconds::period::den, max * Milliseconds::period::den); } float frand(float min, float max) { ASSERT(max >= min); - return float(GetRng()->Random() * (max - min) + min); + std::uniform_real_distribution urd(min, max); + return urd(engine); } Milliseconds randtime(Milliseconds min, Milliseconds max) @@ -72,26 +74,28 @@ Milliseconds randtime(Milliseconds min, Milliseconds max) uint32 rand32() { - return GetRng()->BRandom(); + return GetRng()->RandomUInt32(); } double rand_norm() { - return GetRng()->Random(); + std::uniform_real_distribution urd; + return urd(engine); } double rand_chance() { - return GetRng()->Random() * 100.0; + std::uniform_real_distribution urd(0.0, 100.0); + return urd(engine); } uint32 urandweighted(size_t count, double const* chances) { std::discrete_distribution dd(chances, chances + count); - return dd(SFMTEngine::Instance()); + return dd(engine); } -SFMTEngine& SFMTEngine::Instance() +RandomEngine& RandomEngine::Instance() { return engine; } -- cgit v1.2.3