diff options
author | Fedja Beader <fedja@protonmail.ch> | 2025-01-23 01:39:08 +0100 |
---|---|---|
committer | Fedja Beader <fedja@protonmail.ch> | 2025-01-24 01:14:30 +0100 |
commit | 1ba5b02cb9ffa83a0e8ff283f4d01d0044eb533e (patch) | |
tree | 24df2acf4790d8b1ece6e32886db653650149da3 /src/generic | |
parent | d8782a82fc0cbc6b52d2f7385229cbe832562b95 (diff) | |
download | tmwa-1ba5b02cb9ffa83a0e8ff283f4d01d0044eb533e.tar.gz tmwa-1ba5b02cb9ffa83a0e8ff283f4d01d0044eb533e.tar.bz2 tmwa-1ba5b02cb9ffa83a0e8ff283f4d01d0044eb533e.tar.xz tmwa-1ba5b02cb9ffa83a0e8ff283f4d01d0044eb533e.zip |
Ensure that a continuous rise in drop rate boosts results in a continuous rise in actual drop rate.
Diffstat (limited to 'src/generic')
-rw-r--r-- | src/generic/random.cpp | 4 | ||||
-rw-r--r-- | src/generic/random.hpp | 14 | ||||
-rw-r--r-- | src/generic/random.t.hpp | 5 |
3 files changed, 18 insertions, 5 deletions
diff --git a/src/generic/random.cpp b/src/generic/random.cpp index e37a3d1..d29c984 100644 --- a/src/generic/random.cpp +++ b/src/generic/random.cpp @@ -25,6 +25,8 @@ namespace tmwa { namespace random_ { - std::mt19937 generate{std::random_device()()}; + std::random_device seed_class; + std::mt19937 generate{seed_class()};//std::random_device()()}; + std::mt19937_64 generate64{ ((uint64_t)seed_class() << 32) + seed_class()}; } // namespace random_ } // namespace tmwa diff --git a/src/generic/random.hpp b/src/generic/random.hpp index 897ad43..7310e21 100644 --- a/src/generic/random.hpp +++ b/src/generic/random.hpp @@ -33,8 +33,10 @@ namespace random_ { /// Get a random number from 0 .. 2**32 - 1 extern std::mt19937 generate; + extern std::mt19937_64 generate64; /// Get a random number from 0 .. bound - 1 + // TODO: Deduplicate this. inline int to(int bound) { @@ -42,6 +44,13 @@ namespace random_ return dist(generate); } + inline + int64_t to(int64_t bound) + { + std::uniform_int_distribution<int64_t> dist(0, bound - 1); + return dist(generate64); + } + /// Get a random number from low .. high (inclusive!) inline int in(int low, int high) @@ -58,8 +67,9 @@ namespace random_ return dist(generate); } + template<typename T = int> inline - bool chance(Fraction f) + bool chance(Fraction<T> f) { if (f.num <= 0) return false; @@ -75,7 +85,7 @@ namespace random_ template<class C> auto choice(C&& c) -> decltype(*c.begin()) { - return *(c.begin() + random_::to(c.size())); + return *(c.begin() + random_::to((int64_t)c.size())); } // allow bare braces diff --git a/src/generic/random.t.hpp b/src/generic/random.t.hpp index b4c4764..985ba3b 100644 --- a/src/generic/random.t.hpp +++ b/src/generic/random.t.hpp @@ -25,9 +25,10 @@ namespace tmwa { namespace random_ { + template<class T = int> struct Fraction { - int num, den; + T num, den; }; template<class T, T den> @@ -35,7 +36,7 @@ namespace random_ { T num; - operator Fraction() + operator Fraction<T>() { return {num, den}; } |