diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-12-24 19:48:39 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-02-09 19:26:29 +0100 |
commit | 55ef8d80a37eceac9b883798e8a7dbda4b40ce12 (patch) | |
tree | 0a1e57e21cd1d5ba735eedb04c5c43bfe3666138 /src/common/Utilities/Random.h | |
parent | 761c82e65ae01e56d0efc7a7ba0dabdb2e44c5a7 (diff) |
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 ae20b2ab561bc07d85f443ae914bc597c9d6ac6e)
(cherry picked from commit 921d893c2a82eb6ac0762bf7001df87911b44611)
(cherry picked from commit 9ab10d6e680ca835d1dfdfbceb9f18f330f994fc)
(cherry picked from commit 00c878e73a8c6b8ce3339d224ab5611df3bbd07c)
(cherry picked from commit ff9c999334d87acc3fcea9737753c30b7f1abe25)
(cherry picked from commit bc94bacce404401a480b6871eaa7bc38d766014c)
(cherry picked from commit d5b0ffbe9b0c07beb8d0dfc52a6532c2da805285)
Diffstat (limited to 'src/common/Utilities/Random.h')
-rw-r--r-- | src/common/Utilities/Random.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/common/Utilities/Random.h b/src/common/Utilities/Random.h new file mode 100644 index 00000000000..5610651a83b --- /dev/null +++ b/src/common/Utilities/Random.h @@ -0,0 +1,95 @@ +/* + * 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/>. + */ + +#ifndef Random_h__ +#define Random_h__ + +#include "Define.h" +#include <limits> +#include <random> + +/* Return a random number in the range min..max. */ +int32 irand(int32 min, int32 max); + +/* Return a random number in the range min..max (inclusive). */ +uint32 urand(uint32 min, uint32 max); + +/* Return a random millisecond value between min and max seconds. Functionally equivalent to urand(min*IN_MILLISECONDS, max*IN_MILLISECONDS). */ +uint32 urandms(uint32 min, uint32 max); + +/* Return a random number in the range 0 .. UINT32_MAX. */ +uint32 rand32(); + +/* Return a random number in the range min..max */ +float frand(float min, float max); + +/* Return a random double from 0.0 to 1.0 (exclusive). */ +double rand_norm(); + +/* Return a random double from 0.0 to 100.0 (exclusive). */ +double rand_chance(); + +/* Return true if a random roll fits in the specified chance (range 0-100). */ +inline bool roll_chance_f(float chance) +{ + return chance > rand_chance(); +} + +/* Return true if a random roll fits in the specified chance (range 0-100). */ +inline bool roll_chance_i(int chance) +{ + return chance > irand(0, 99); +} + +/* +* SFMT wrapper satisfying UniformRandomNumberGenerator concept for use in <random> algorithms +*/ +class SFMTEngine +{ +public: + typedef uint32 result_type; + + static TRINITY_CONSTEXPR result_type min() { return std::numeric_limits<result_type>::min(); } + static TRINITY_CONSTEXPR result_type max() { return std::numeric_limits<result_type>::max(); } + result_type operator()() const { return rand32(); } + + static SFMTEngine& Instance(); +}; + +// Ugly, horrible, i don't even..., hack for VS2013 to work around missing discrete_distribution(iterator, iterator) constructor +namespace Trinity +{ +#if COMPILER == COMPILER_MICROSOFT && _MSC_VER <= 1800 + template<typename T> + struct discrete_distribution_param : public std::discrete_distribution<T>::param_type + { + typedef typename std::discrete_distribution<T>::param_type base; + + template<typename InIt> + discrete_distribution_param(InIt begin, InIt end) : base(_Noinit()) + { + this->_Pvec.assign(begin, end); + this->_Init(); + } + }; +#else + template<typename T> + using discrete_distribution_param = typename std::discrete_distribution<T>::param_type; +#endif +} + +#endif // Random_h__ |