Классический Fisher Yates выглядит примерно так:
void shuffle1(std::vector<int>& vec)
{
int n = vec.size();
for (int i = n - 1; i > 0; --i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Вчера я выполнил итерацию "назад" по ошибке:
void shuffle2(std::vector<int>& vec)
{
int n = vec.size();
for (int i = 1; i < n; ++i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Является ли эта версия каким-либо образом хуже (или лучше), чем первая? Препятствует ли этому появлению вероятности?