Fix RNG bugs from upgrade to C++17
staticRandomShuffle now uses its own tiny impl of the deprecated std::random_shuffle, producing identical results in testing
This commit is contained in:
parent
53c4dc3491
commit
497c6efc55
@ -208,8 +208,8 @@ typename Container::value_type Random::randValueFrom(
|
||||
|
||||
template <typename Container>
|
||||
void Random::shuffle(Container& container) {
|
||||
size_t max = container.size();
|
||||
std::shuffle(container.begin(), container.end(), URBG<size_t>([max]() { return Random::randUInt(max - 1); }));
|
||||
RandomSource random;
|
||||
std::shuffle(container.begin(), container.end(), URBG<size_t>([&]() { return static_cast<size_t>(random.randu64()); }));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -134,11 +134,14 @@ private:
|
||||
|
||||
template <typename Container, typename T, typename... TL>
|
||||
void staticRandomShuffle(Container& container, T const& d, TL const&... rest) {
|
||||
int mix = 0;
|
||||
size_t max = container.size();
|
||||
std::shuffle(container.begin(), container.end(), URBG<size_t>([&]() {
|
||||
return staticRandomU32Range(0, max - 1, ++mix, d, rest...);
|
||||
}));
|
||||
auto begin = container.begin();
|
||||
auto end = container.end();
|
||||
auto it = begin;
|
||||
for (int i = 1, mix = 0; ++it != end; ++i) {
|
||||
int off = staticRandomU32Range(0, i, ++mix, d, rest...);
|
||||
if (off != i)
|
||||
std::swap(*it, *(begin + off));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user