/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "Random.h" #include "Errors.h" #include "SFMTRand.h" #include #include namespace { constexpr RandomEngine engine; SFMTRand* GetRng() noexcept { thread_local std::unique_ptr sfmtRand = std::make_unique(); return sfmtRand.get(); } } int32 irand(int32 min, int32 max) { ASSERT(max >= min); std::uniform_int_distribution uid(min, max); return uid(engine); } uint32 urand(uint32 min, uint32 max) { ASSERT(max >= min); std::uniform_int_distribution uid(min, max); return uid(engine); } uint32 urandms(uint32 min, uint32 max) { ASSERT(std::numeric_limits::max() / Milliseconds::period::den >= max); return urand(min * Milliseconds::period::den, max * Milliseconds::period::den); } float frand(float min, float max) { ASSERT(max >= min); std::uniform_real_distribution urd(min, max); return urd(engine); } Milliseconds randtime(Milliseconds min, Milliseconds max) { long long diff = max.count() - min.count(); ASSERT(diff >= 0); ASSERT(diff <= 0xFFFFFFFF); return min + Milliseconds(urand(0, uint32(diff))); } uint32 rand32() { return GetRng()->RandomUInt32(); } float rand_norm() { std::uniform_real_distribution urd; return urd(engine); } float rand_chance() { std::uniform_real_distribution urd(0.0f, 100.0f); return urd(engine); } uint32 urandweighted(size_t count, double const* chances) { std::discrete_distribution dd(chances, chances + count); return dd(engine); }