如何创建随机对象列表?

时间:2016-06-09 02:41:14

标签: python oop python-3.x

$(".scroller-back").mCustomScrollbar("scrollTo", $("#yourdiv"));

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

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
事实证明我实际上创建了完全相同对象的for count in range(numCardsInHand): self.list.append(Card(all_rank, all_suit)) 。似乎随机模块不能在我的numCardsInHand循环上工作。我有问题搞清楚。

3 个答案:

答案 0 :(得分:2)

您需要在循环中调用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))

答案 1 :(得分:2)

random模块仅将值赋给变量,变量固定在变量上。每次调用变量时都不会重新分配(这很奇怪)。换句话说,每次需要新值时都应该再次调用该函数。在你的情况下,

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

另一种方法是为函数本身分配一个变量。所以你的代码看起来像是:

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

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

虽然这可能令人困惑。

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

答案 2 :(得分:2)

all_rank不是生成随机排名的函数;它一个随机选择的排名,作为对random.choice的单次调用的结果。 (同样适用于all_suit。)

但是,即使您每次拨打random.choice时都拨打了random.randintCard,也会遇到更严重的问题:您不能保证不会选择同一张卡两次。解决方案很简单:创建一副牌,然后使用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)

要选择多只手,您可以选择一只手,取出从牌组中选择的牌,然后再次取样。然而,只是洗牌并处理它们就更简单了。

deck = [Card(rank, suit) for rank in range(1,14) for suit in ['d', 'h', 'c', 's']]
random.shuffle(deck)
hand1 = deck[0:numCardsInHand]
hand2 = deck[numCardsInHand:2*numCardsInHand]
# etc