2016-06-09 92 views
2
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循環。我有問題搞清楚了。

回答

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)) 
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

all_rank不是產生隨機等級的函數;它單個隨機選擇的排名,作爲對random.choice的單個調用的結果。 (同樣爲all_suit

但是,即使你叫random.choice並在每次調用Card時間random.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