@@ -24,9 +24,16 @@ namespace mrpt::random
2424template <class RandomIt , class URBG >
2525void shuffle (RandomIt first, RandomIt last, URBG&& g)
2626{
27- const uint64_t n = last - first;
27+ const auto n = static_cast <int64_t >(last - first);
28+ if (n == 0 )
29+ {
30+ return ;
31+ }
2832 for (int64_t i = static_cast <int64_t >(n) - 1 ; i > 0 ; --i)
29- std::swap (first[i], first[portable_uniform_distribution (g, 0 , i)]);
33+ {
34+ const auto idx = portable_uniform_distribution (g, 0 , static_cast <uint64_t >(i));
35+ std::swap (first[i], first[static_cast <typename RandomIt::difference_type>(idx)]);
36+ }
3037}
3138
3239/* * Uniform shuffle a sequence.
@@ -49,10 +56,19 @@ void shuffle(RandomIt first, RandomIt last)
4956template <class RandomIt , class URBG >
5057void partial_shuffle (RandomIt first, RandomIt last, URBG&& g, size_t N)
5158{
52- const int64_t n = static_cast <int64_t >(last - first);
53- const int64_t n_1 = n - 1 ;
54- for (int64_t i = 0 ; i < n && i < static_cast <int64_t >(N); ++i)
55- std::swap (first[i], first[portable_uniform_distribution (g, i, n_1)]);
59+ const uint64_t n = static_cast <uint64_t >(last - first);
60+ if (n == 0 || N == 0 )
61+ {
62+ return ;
63+ }
64+ const uint64_t n_1 = n - 1 ;
65+ for (uint64_t i = 0 ; i < n && i < N; ++i)
66+ {
67+ const auto idx = portable_uniform_distribution (g, i, n_1);
68+ std::swap (
69+ first[static_cast <typename RandomIt::difference_type>(i)],
70+ first[static_cast <typename RandomIt::difference_type>(idx)]);
71+ }
5672}
5773
5874} // namespace mrpt::random
0 commit comments