| 20 | // Fisher–Yates algorithm |
| 21 | template <class RandomAccessIterator, class RandomGenerator> |
| 22 | inline void shuffle(RandomAccessIterator begin, RandomAccessIterator end, |
| 23 | RandomGenerator* gen) { |
| 24 | typedef typename std::iterator_traits<RandomAccessIterator>::difference_type |
| 25 | difference_type; |
| 26 | typedef typename boost::uniform_int<difference_type> dist_type; |
| 27 | |
| 28 | difference_type length = std::distance(begin, end); |
| 29 | if (length <= 0) return; |
| 30 | |
| 31 | for (difference_type i = length - 1; i > 0; --i) { |
| 32 | dist_type dist(0, i); |
| 33 | std::iter_swap(begin + i, begin + dist(*gen)); |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | template <class RandomAccessIterator> |
| 38 | inline void shuffle(RandomAccessIterator begin, RandomAccessIterator end) { |
no test coverage detected