我正在编写一个扑克引擎,该引擎可以从大量牌组中抽出并创造出很多手牌。我想让每只手只包含唯一的卡片,因此在创建手时实施了重复检查:
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预定义为空字典)
答案 0 :(得分:1)
如果要在列表中的随机位置插入项目,请使用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]
应该比插入列表中间更快。但是,由于涉及将其他卡移动到末尾,因此可能会令人感到怀疑。 (但是,由于应该改组甲板,因此实际上并不重要。)
答案 1 :(得分:1)
获取不是最后一个随机元素的索引:
index = random.randint(0, (len(self.cards) - 1))
然后只需切换两个元素:
self.cards[index], self.cards[-1] = self.cards[-1], self.cards[index]