Как отмечает @Sean Payne; pop()
- это не путь к go. pop()
ужасно медленный, когда все, что вам нужно сделать, это поменять местами значения. Python разрешает (поощряет) присваивание кортежей, поэтому можно менять местами значения без использования временного хранилища x, y = y, x
, или в данном случае deck[i], deck[j] = deck[j], deck[i]
.
A for
l oop больше pythoni c, чем while
l oop.
Я предполагаю, что ваш инструктор пытается заставить вас написать правильный тасование Кнута ( ссылка ), также называемое Фишером -Йетс, или Фишер-Йетс-Кнут. Дюрстенфельд внес еще один важный вклад в разработку алгоритма.
import random
def shuffle(deck):
for i in range(len(deck)-1, 0, -1):
j = random.randint(0,i)
deck[i], deck[j] = deck[j], deck[i]
return deck
mydeck = list(range(52))
print(mydeck)
print(shuffle(mydeck))
Попробуйте онлайн!
Следует отметить большое различие в том, что как только вы выбираете, какой элемент идет до конца списка, с которым вы работаете, оставьте его там. Если вы продолжите генерировать числа, которые позволяют перетасовать ваши уже перемешанные элементы, это фактически снижает случайность перемешивания. Майк Босток и Джефф Этвуд оба имеют очень хорошее объяснение этой проблемы.
Если вы действительно хотите перетасовать и перед, и в назад, вы можете сделать что-то вроде
import random
def shuffle2(deck):
back_of_deck = len(deck) - 1
for i in range(len(deck)//2):
front = random.randint(i,back_of_deck)
back = random.randint(i,back_of_deck)
deck[i], deck[front] = deck[front], deck[i]
deck[back_of_deck], deck[back] = deck[back], deck[back_of_deck]
back_of_deck -= 1
return deck
mydeck = list(range(52))
print(mydeck)
print(shuffle2(mydeck))
Попробуйте онлайн!