#include "Random.hpp" #include #include TSE::Random::Random(uint seed) { state = static_cast(static_cast(seed)); } TSE::uint TSE::Random::nextUInt(uint minInc, uint maxInc) { constexpr std::uint32_t multiplier = 1664525u; constexpr std::uint32_t increment = 1013904223u; std::uint32_t nextState = static_cast(state); nextState = nextState * multiplier + increment; state = static_cast(nextState); if(minInc == 0u && maxInc == 0u) { return state; } if(minInc > maxInc) { uint temp = minInc; minInc = maxInc; maxInc = temp; } const std::uint64_t span = static_cast(maxInc) - static_cast(minInc) + 1ull; const std::uint64_t offset = static_cast(nextState) % span; return static_cast(static_cast(minInc) + offset); } int TSE::Random::nextInt(int minInc, int maxInc) { const std::uint32_t bits = static_cast(nextUInt()); if(minInc == 0 && maxInc == 0) { return static_cast(std::bit_cast(bits)); } if(minInc > maxInc) { int temp = minInc; minInc = maxInc; maxInc = temp; } const std::int64_t span = static_cast(maxInc) - static_cast(minInc) + 1ll; const std::uint64_t offset = static_cast(bits) % static_cast(span); const std::int64_t value = static_cast(minInc) + static_cast(offset); return static_cast(value); } short TSE::Random::nextShort(short minInc, short maxInc) { const std::uint32_t bits = static_cast(nextUInt()); const std::uint16_t lowerBits = static_cast(bits); if(minInc == 0 && maxInc == 0) { return static_cast(std::bit_cast(lowerBits)); } if(minInc > maxInc) { short temp = minInc; minInc = maxInc; maxInc = temp; } const std::int32_t span = static_cast(maxInc) - static_cast(minInc) + 1; const std::uint32_t offset = static_cast(lowerBits) % static_cast(span); const std::int32_t value = static_cast(minInc) + static_cast(offset); return static_cast(value); } TSE::byte TSE::Random::nextByte(byte minInc, byte maxInc) { const std::uint32_t bits = static_cast(nextUInt()); const std::uint8_t lowerBits = static_cast(bits); if(minInc == 0 && maxInc == 0) { return static_cast(lowerBits); } if(minInc > maxInc) { byte temp = minInc; minInc = maxInc; maxInc = temp; } const std::uint16_t span = static_cast(maxInc) - static_cast(minInc) + 1u; const std::uint16_t offset = static_cast(lowerBits) % span; return static_cast(static_cast(minInc) + offset); } float TSE::Random::nextFloat01() { constexpr float invRange = 1.0f / 4294967296.0f; return static_cast(static_cast(nextUInt())) * invRange; }