Python перемешивание shuffle

Рандомизируем порядок значений списка, возвращая новый список в Python.

В shuffle  Используется алгоритм Фишера-Йейтса для изменения порядка элементов списка.
Выглядел он следующим образом:

Запишем числа от 1 до N.
Выберем случайное число k между единицей и числом оставшихся чисел.
Вычеркиваем k-е оставшееся число, отсчитывая числа в порядке возрастания, и записываем его где-нибудь.
Повторяем шаг 2, пока все числа не будут выбраны.
Последовательность чисел, записанных на шаге 3, является случайной перестановкой.
Если числа, используемые на шаге 2, действительно случайны и не смещены, мы получим такими же и случайные перестановки (случайны и не смещены). Фишер и Йейтс описали, каким образом получить такие случайные числа для любого интервала, и предоставили таблицы, позволяющие избежать смещения. Они также предполагали возможность упростить метод — выбирать случайные числа от единицы до N, и, затем, отбрасывать повторения — для генерации половины генерируемой перестановки, и только потом использовать более сложный алгоритм для оставшейся половины, в противном случае повторяющиеся числа будут попадаться слишком часто.

random.shuffle предоставляет аналогичную функциональность для этого фрагмента.
from copy import deepcopy
from random import randint

def shuffle(lst):
  temp_lst = deepcopy(lst)
  m = len(temp_lst)
  while (m):
    m -= 1
    i = randint(0, m)
    temp_lst[m], temp_lst[i] = temp_lst[i], temp_lst[m]
  return temp_lst

#Пример кода:
foo = [1, 2, 3]
shuffle(foo) # [2, 3, 1], foo = [1, 2, 3]

Ответить