Алгоритм, который выглядит как пузырьковая сортировка:
for i= 0:(len(x)-1):
j = random(i,len(x)-1)
swap(x[i],x[j])
Предположим, что random (a, b) возвращает случайное целое число c, такое что a <= c <= b. </p>
И этот алгоритм называется "Fisher Yates Shuffle".
FWIW, вы не можете «по-настоящему» перетасовать большой массив стандартными встроенными генераторами случайных чисел. Перестановка из 21 элемента имеет энтропию в 65 бит, где большинство ГСЧ имеют 64 или 32 бита.