diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-11-09 13:32:58 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-12-19 00:13:11 +0100 |
commit | b93bf95f2e76eca8be12ba07828387ab8529c050 (patch) | |
tree | 3cce522959f5a57ed2c57aca2d0b339ad79bce4e /src/common/Utilities/Random.cpp | |
parent | 08b40733a58da23ced34915cb67c0ef24e6e9059 (diff) |
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)
Diffstat (limited to 'src/common/Utilities/Random.cpp')
-rw-r--r-- | src/common/Utilities/Random.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
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 <random> static boost::thread_specific_ptr<SFMTRand> 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<int32> uid(min, max); + return uid(engine); } uint32 urand(uint32 min, uint32 max) { ASSERT(max >= min); - return GetRng()->URandom(min, max); + std::uniform_int_distribution<uint32> uid(min, max); + return uid(engine); } uint32 urandms(uint32 min, uint32 max) { - ASSERT(max >= min); ASSERT(std::numeric_limits<uint32>::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<float> 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<double> urd; + return urd(engine); } double rand_chance() { - return GetRng()->Random() * 100.0; + std::uniform_real_distribution<double> urd(0.0, 100.0); + return urd(engine); } uint32 urandweighted(size_t count, double const* chances) { std::discrete_distribution<uint32> dd(chances, chances + count); - return dd(SFMTEngine::Instance()); + return dd(engine); } -SFMTEngine& SFMTEngine::Instance() +RandomEngine& RandomEngine::Instance() { return engine; } |