21#include <boost/math/tools/roots.hpp>
31 thread_local std::unique_ptr<SFMTRand> sfmtRand = std::make_unique<SFMTRand>();
32 return sfmtRand.get();
39 std::uniform_int_distribution<int32> uid(min, max);
46 std::uniform_int_distribution<uint32> uid(min, max);
52 ASSERT(std::numeric_limits<uint32>::max() / Milliseconds::period::den >= max);
53 return urand(min * Milliseconds::period::den, max * Milliseconds::period::den);
56float frand(
float min,
float max)
59 std::uniform_real_distribution<float> urd(min, max);
65 long long diff = max.count() - min.count();
67 ASSERT(diff <= 0xFFFFFFFF);
73 return GetRng()->RandomUInt32();
78 std::uniform_real_distribution<float> urd;
84 std::uniform_real_distribution<float> urd(0.0f, 100.0f);
90 std::discrete_distribution<uint32> dd(chances, chances + count);
96struct PseudoRandomDistributionChanceTable : std::array<float, 10000>
98 PseudoRandomDistributionChanceTable()
101 for (std::size_t i = 1; i <
size(); ++i)
102 (*
this)[i] = NormalizePseudoRandomDistributionChance(i * 0.0001f);
105 static float NormalizePseudoRandomDistributionChance(
float chance)
107 std::uintptr_t iterationLimit = 10;
108 return boost::math::tools::newton_raphson_iterate([target = 1.0f / chance](
float p) -> std::pair<float, float>
111 std::pair<float, float> chain = { 1.0f, 0.0f };
112 std::pair<float, float> result = { 1.0f - target, 0.0f };
115 for (
uint32 i = 1; i < cap; ++i)
117 float chanceToFail = 1 - p * i;
118 chain.second = chain.second * chanceToFail - chain.first * i;
119 chain.first = chain.first * chanceToFail;
121 result.first += chain.first;
122 result.second += chain.second;
126 }, chance * chance, 0.0f, chance, 6, iterationLimit);
133 std::ptrdiff_t chanceIndex = std::ptrdiff_t(std::round(chance * 100.0f));
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
float frand(float min, float max)
uint32 urandweighted(size_t count, double const *chances)
int32 irand(int32 min, int32 max)
Milliseconds randtime(Milliseconds min, Milliseconds max)
bool roll_chance(float chance, PseudoRandomDistributionState &state)
uint32 urand(uint32 min, uint32 max)
uint32 urandms(uint32 min, uint32 max)
constexpr std::size_t size()
float AccumulateChance(float progress)