如何创建随机对象列表?

2024-10-04 01:25:16 发布

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

class HandOfCards:

    def __init__ (self, numCardsInHand):
        self.list = []

        all_rank = random.randint(1, 13)
        random_suit = ['d', 'c', 'h', 's']
        all_suit = random.choice(random_suit)


        for count in range(numCardsInHand):
            self.list.append(Card(all_rank, all_suit))


    def __str__(self):
        all_items = '\n'.join(map(str, self.list))
        return all_items

我想创建一些随机对象,但是用循环

^{pr2}$

结果我实际上创建了numCardsInHand完全相同的对象。随机模块似乎在我的for循环上不起作用。我想不通。在


Tags: 对象selfforinitdefitemsrandomall
3条回答

all_rank不是一个生成随机秩的函数;它是一个随机选择的单个秩,是对random.choice调用的结果。(对于all_suit也是如此。)

然而,即使你每次打电话给random.choicerandom.randint,你也有一个更大的问题:你不能保证你不会选择同一张牌两次。解决方案很简单:创建一副牌,然后使用random.sample从牌堆中挑选。在

# All 52 possible cards
deck = [Card(rank, suit) for rank in range(1,14) for suit in ['d', 'h', 'c', 's']]
hand = random.sample(deck, numCardsInHand)

若要选择多只手牌,请选择一只手牌,从牌堆中取出所选牌,然后再次取样。然而,这是更简单的只是洗牌和处理他们。在

^{pr2}$

您需要在循环中调用random模块:

    for count in range(numCardsInHand):
        all_rank = random.randint(1, 13)
        random_suit = ['d', 'c', 'h', 's']
        all_suit = random.choice(random_suit)
        self.list.append(Card(all_rank, all_suit))

random模块只给变量赋值,变量是固定的。它不会在每次调用变量时重新赋值(这很奇怪)。换句话说,每次需要新值时都应该再次调用函数。就你而言

for count in range(numCardsInHand):
    self.list.append(Card(random.randint(1, 13), random.choice(random_suit))

另一种方法是给函数本身赋值一个变量。所以你的代码应该是:

^{pr2}$

虽然这可能会让人困惑。在

最后一点要注意,不要使用list来存储列表。list是Python中的一个内置组件,下次尝试将任何内容转换为列表时可能会发生冲突。在

相关问题 更多 >