/* * This file is part of the AzerothCore 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 Affero General Public License as published by the * Free Software Foundation; either version 3 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 Affero 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 static thread_local std::unique_ptr sfmtRand; static RandomEngine engine; static SFMTRand* GetRng() { if (!sfmtRand) { 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 <= (uint32) - 1); return min + Milliseconds(urand(0, diff)); } uint32 rand32() { return GetRng()->RandomUInt32(); } double rand_norm() { std::uniform_real_distribution urd; return urd(engine); } double rand_chance() { std::uniform_real_distribution urd(0.0, 100.0); return urd(engine); } uint32 urandweighted(size_t count, double const* chances) { std::discrete_distribution dd(chances, chances + count); return dd(engine); } RandomEngine& RandomEngine::Instance() { return engine; }