在python中创建一个随机数列表,而不使用另一个列表中的数字

时间:2016-01-12 23:51:16

标签: python

我正在尝试制作纸牌游戏,我希望能够在列表中生成随机数,但我不希望这些数字在程序运行后使用一次后重复出现。

这是我到目前为止所做的:

usedcards = []
import random

def choosecards():
    global usedcards
    cards=random.sample(range(52), 5)
    usedcards = usedcards + cards
    #print(usedcards)
    return cards

每次运行该功能时,我都希望使用卡片变量对usedcards列表进行交叉检查。

我怎样才能实现这一目标?

3 个答案:

答案 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.