TGViewer
C++ Academy C++ Academy @cpluspluc · 15.5K subscribers
Post #1527 2.38K
🖥 Большинство “простых” shuffle-алгоритмов дают кривой рандом

Частая ошибка:


for (int i = 0; i < n; i++) {
int j = rand() % n;
swap(a[i], a[j]);
}


На вид всё нормально: каждый элемент случайно меняется местами с другим.

Но проблема в вероятностях.

Для массива из n элементов существует n! перестановок.

Хороший shuffle должен давать каждой перестановке одинаковый шанс.

Наивный вариант делает n шагов, и на каждом шаге выбирает индекс из полного диапазона 0..n-1.

В итоге некоторые перестановки появляются чаще других.

Правильный подход - Fisher-Yates shuffle:


for (int i = n - 1; i > 0; i--) {
int j = random(0, i);
swap(a[i], a[j]);
}


Идея простая:

на каждом шаге мы выбираем элемент только из ещё не зафиксированной части массива.

Сначала выбираем последний элемент из всего массива.
Потом предпоследний - из оставшихся.
Потом следующий - из ещё меньшего диапазона.

Так каждая перестановка получает одинаковую вероятность.

В C++ лучше не писать через rand() % n, потому что там может быть ещё и modulo bias.

Нормальный вариант:


std::mt19937 rng(std::random_device{}());

for (int i = n - 1; i > 0; --i) {
std::uniform_int_distribution<int> dist(0, i);
int j = dist(rng);
std::swap(a[i], a[j]);
}


Shuffle - хороший пример, где код может выглядеть “рандомным”, но математически быть неправильным.
  • ❤ 8
  • ❤‍🔥 5
  • 👍 1
More from @cpluspluc
  1. Sep 22, 2026⚡️ Как спроектировать ИИ-агента над корпоративными данными 6 октября в 17:00 мск пройдёт н…
  2. Sep 22, 2026Лицо C++-разработчика, когда он написал 6000 строк кода, чтобы обогнать твои 4 строки на P…
  3. Sep 18, 2026Как посчитать миллиарды уникальных значений, используя всего несколько килобайт памяти Для…
  4. Sep 17, 2026⚙️ useful_abstractions - вычисления на этапе компиляции в C++23 Библиотека упрощает работу…
  5. Sep 17, 2026Разница между C++ и Python
  6. Sep 17, 2026«Я про бэкенд»: как устроены AI-системы под капотом бигтеха 🗓 3 октября, Москва и онлайн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →