diff options
Diffstat (limited to 'src/z-rand.hpp')
-rw-r--r-- | src/z-rand.hpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/z-rand.hpp b/src/z-rand.hpp index b04523c3..645b3117 100644 --- a/src/z-rand.hpp +++ b/src/z-rand.hpp @@ -1,8 +1,9 @@ #pragma once -#include "h-basic.h" +#include "h-basic.hpp" #include "seed_fwd.hpp" +#include <cassert> #include <string> /**** Available constants ****/ @@ -91,7 +92,8 @@ s32b rand_spread(s32b a, s32b d); **/ template <class C> typename C::const_iterator uniform_element(C const &c) { - return c.cbegin() + rand_int(c.size()); + assert(!c.empty()); + return std::next(std::cbegin(c), rand_int(c.size())); } /** @@ -101,5 +103,24 @@ template <class C> typename C::const_iterator uniform_element(C const &c) **/ template <class C> typename C::iterator uniform_element(C &c) { - return c.begin() + rand_int(c.size()); + assert(!c.empty()); + return std::next(std::begin(c), rand_int(c.size())); +} + +/** + * Shuffle contents of given random-access container. + */ +template <class C> void shuffle(C &c) +{ + if (c.empty()) + { + return; + } + + auto n = c.size(); + + for (auto i = n - 1; i > 0; i--) + { + std::swap(c[i], c[rand_int(i + 1)]); + } } |