【问题标题】:How to create a list of random objects?如何创建随机对象列表?
【发布时间】:2016-06-09 02:41:14
【问题描述】:
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。似乎随机模块不适用于我的 for 循环。我很难搞清楚。

【问题讨论】:

    标签: python oop python-3.x


    【解决方案1】:

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

    【讨论】:

      【解决方案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 内置的,下次尝试将任何内容转换为列表时可能会发生冲突。

      【讨论】:

        【解决方案3】:

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

        但是,即使您每次调用Card 时都调用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)
        

        要选择多手牌,您选择一只手,从牌堆中取出选择的牌,然后再次取样。然而,直接洗牌然后发牌会更简单。

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-15
          • 1970-01-01
          • 2022-11-14
          • 1970-01-01
          • 2020-11-29
          • 1970-01-01
          相关资源
          最近更新 更多