summaryrefslogtreecommitdiff
path: root/src/generic
diff options
context:
space:
mode:
authorFedja Beader <fedja@protonmail.ch>2025-01-23 01:39:08 +0100
committerFedja Beader <fedja@protonmail.ch>2025-01-24 01:14:30 +0100
commit1ba5b02cb9ffa83a0e8ff283f4d01d0044eb533e (patch)
tree24df2acf4790d8b1ece6e32886db653650149da3 /src/generic
parentd8782a82fc0cbc6b52d2f7385229cbe832562b95 (diff)
downloadtmwa-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.cpp4
-rw-r--r--src/generic/random.hpp14
-rw-r--r--src/generic/random.t.hpp5
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};
}