我正在尝试制作纸牌游戏,我希望能够在列表中生成随机数,但我不希望这些数字在程序运行后使用一次后重复出现。
这是我到目前为止所做的:
usedcards = []
import random
def choosecards():
global usedcards
cards=random.sample(range(52), 5)
usedcards = usedcards + cards
#print(usedcards)
return cards
每次运行该功能时,我都希望使用卡片变量对usedcards
列表进行交叉检查。
我怎样才能实现这一目标?
答案 0 :(得分:4)
以下是使用集合执行此操作的一种方法。套装可以很容易地排除已经使用过的卡片。
import random
used_cards = set()
def choose_cards(n_cards):
# No need to do 'global used_cards', used_cards is
# already global and can be modified inplace
# Find the set difference between all the cards and
# those that have been used
available = set(range(52)) - used_cards
chosen = random.sample(available, n_cards)
for card in chosen:
used_cards.add(card)
return chosen
for i in range(4):
print(choose_cards(5))
print(used_cards)
答案 1 :(得分:3)
生成器可以保持状态并隐藏详细信息:
import random
def choosecards(amount=5):
cards = list(range(52))
random.shuffle(cards)
while True:
yield [cards.pop() for _ in range(amount)]
>>> cards = choosecards()
>> next(cards)
[37, 41, 13, 2, 33]
>>> next(cards)
[4, 8, 7, 38, 23]
答案 2 :(得分:2)
不要使用全局变量。如果正确使用参数,问题就很容易解决。
def choosecards(stack, amount=5):
cards=[ stack.pop() for i in range(amount) ]
return cards
deck = list(range(52))
random.shuffle(deck)
hand = choosecards(deck)
otherhand = choosecards(deck)
#etc.