Core/Utils: Moved rng functions to separate header and added utility functions to select a random element from a container where each element can have different chance of being selected

(cherry picked from commit ae20b2ab56)
(cherry picked from commit 921d893c2a)
(cherry picked from commit 9ab10d6e68)
(cherry picked from commit 00c878e73a)
(cherry picked from commit ff9c999334)
(cherry picked from commit bc94bacce4)
(cherry picked from commit d5b0ffbe9b)
This commit is contained in:
Shauren
2015-12-24 19:48:39 +01:00
parent 761c82e65a
commit 55ef8d80a3
6 changed files with 241 additions and 95 deletions

View File

@@ -0,0 +1,83 @@
/*
* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include "Random.h"
#include "Common.h"
#include "Errors.h"
#include "SFMT.h"
#include <boost/thread/tss.hpp>
static boost::thread_specific_ptr<SFMTRand> sfmtRand;
static SFMTRand* GetRng()
{
SFMTRand* rand = sfmtRand.get();
if (!rand)
{
rand = new SFMTRand();
sfmtRand.reset(rand);
}
return rand;
}
int32 irand(int32 min, int32 max)
{
ASSERT(max >= min);
return int32(GetRng()->IRandom(min, max));
}
uint32 urand(uint32 min, uint32 max)
{
ASSERT(max >= min);
return GetRng()->URandom(min, max);
}
uint32 urandms(uint32 min, uint32 max)
{
ASSERT(max >= min);
ASSERT(INT_MAX / IN_MILLISECONDS >= max);
return GetRng()->URandom(min * IN_MILLISECONDS, max * IN_MILLISECONDS);
}
float frand(float min, float max)
{
ASSERT(max >= min);
return float(GetRng()->Random() * (max - min) + min);
}
uint32 rand32()
{
return GetRng()->BRandom();
}
double rand_norm()
{
return GetRng()->Random();
}
double rand_chance()
{
return GetRng()->Random() * 100.0;
}
SFMTEngine& SFMTEngine::Instance()
{
static SFMTEngine engine;
return engine;
}