Перемешать только последний элемент списка - PullRequest
0 голосов
/ 23 марта 2019

Я пишу покерный движок, который тянет из большого количества колод и создает много рук.Я хотел, чтобы каждая рука содержала только уникальные карты, поэтому я реализовал проверку дублирования при создании рук:

def draw(self, c):
        """Generate a hand of c cards"""
        y = 0
        while y < c:
            if self.cards[-1] not in drawcards.values():
                drawcards[y] = self.cards.pop()
                y += 1
            else:
                random.shuffle(self.cards)

        return drawcards

Это прекрасно работает, за исключением того факта, что необходимо random.shuffle(self.cards) (что часто очень велико)) многократно значительно замедлял вывод моей руки.

Есть ли способ перетасовать только последний элемент моего списка cards без использования copy() (что также повлияло бы на память)?

(DrawCards предопределена как пустой словарь)

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Получите индекс случайного элемента, который не является последним:

index = random.randint(0, (len(self.cards) - 1))

Затем просто переключите два элемента:

self.cards[index], self.cards[-1] = self.cards[-1], self.cards[index]
1 голос
/ 23 марта 2019

Если вы хотите вставить элемент в произвольном месте в вашем списке, используйте self.cards.insert(random.randint(0, len(self.cards)), card).

Обратите внимание, что при этом будет O (n) и будет иметь ту же сложность во время выполнения, что и random.shuffle(self.cards).

В качестве альтернативы вы можете сделать:

self.cards.append(item)
last_index = len(self.cards) - 1
random_index = random.randint(0, last_index)

# Swap elements.
self.cards[random_index], self.cards[last_index] = \
    self.cards[last_index], self.cards[random_index]

Что должно быть быстрее, чем вставка в середину списка.Тем не менее, это может показаться сомнительным, поскольку включает в себя перемещение какой-то другой карты до конца.(Но поскольку колода должна быть перетасована, это на самом деле не должно иметь значения.)

...