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

2024-04-23 23:13:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使一个纸牌游戏,我想能够生成一个列表中的随机数,但我不希望这些数字重复后,他们已经使用了一次,而程序正在运行。你知道吗

到目前为止,我掌握的情况如下:

usedcards = []
import random

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

每次运行函数时,我都希望usedcards列表与cards变量交叉检查。你知道吗

我怎样才能做到这一点?你知道吗


Tags: sampleimport程序游戏列表def情况range
3条回答

不要使用globals。如果正确使用参数,问题就很容易解决。你知道吗

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.

这里有一种使用集合的方法。集合使得排除已经使用过的卡非常容易。你知道吗

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)

生成器可以保留状态并隐藏详细信息:

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]

相关问题 更多 >