我目前所拥有的是建造一副牌,改组牌组以及从那张牌组建一只手的代码。
from random import randint
def make_deck():
deck = []
for suit in suits:
for rank in ranks:
deck.append((suit,rank))
return deck
suits = ['spades','hearts','diamonds','clubs']
ranks = ['ace','two','three','four','five','six','seven','eight','nine','ten','jack','queen','king']
deck = make_deck() #list of cards
def shuffle(deck):
for k in range(100): # do it 100 times
card = deck.pop(randint(0,51))
deck.append(card)
def make_hand():
hand = []
for k in range(2):
card = deck.pop(randint(0,51))
hand.append(card)
return hand
hand = make_hand()
当我运行程序时,打印deck
会给我我喜欢的卡片列表,然后当我尝试洗牌时,我得到一个错误,指出pop索引超出范围。不太确定为什么它会超出索引,因为范围(0,51)代表了牌组的所有52张牌。
当我尝试使用make_hand()
函数时出现相同的错误,但并非总是如此。我错误地使用pop
方法吗?我需要更改什么才能使shuffle
功能正常工作,而hand
将始终从套牌中返回两张不同的牌?
答案 0 :(得分:3)
pop
通过从列表中删除项目来改变列表。因此,列表的长度将小于52
,并且最终会抛出错误。不是51
,而是每次使用列表的长度len(deck)
。
对于改组,您还可以使用库shuffle
中的函数random
:
from random import shuffle
## later in the code
shuffle(deck)
答案 1 :(得分:2)
将此作为
更安全card = deck.pop(randint(0,len(deck)-1))
如果你在某个地方保存这个值,它会更快。
但这也指出了你的套牌有问题的问题。你是否正确格式化甲板创建中的循环?您可能创建的卡少于52张,因此当您在高端生成一个整数时,您将捕获该错误。如果它偶尔发生在make_hand(你在那里迭代两次)并且经常在shuffle(你迭代100次)中,这似乎也很可能。
如果您的意图是在发牌后洗牌,那么您肯定需要使用len()或以其他方式跟踪牌组大小。即使在make_hand功能中,您也会弹出一张卡片,然后仍然尝试从大小为52的列表中进行绘制,即使您已经取出了卡片。
答案 2 :(得分:1)
在ims.readUTF()
中,你从牌组中取出2张牌。第一个将永远成功,但第二个必须使用仅包含51张牌的牌组,而在尝试make_hand
时仍有1/52的机会失败。
我无法使用pop(52)
函数重现相同的错误,除非我将shuffle
首先使用的套牌传递给它,所以我假设' m你做了什么。
可以肯定的是,您可以在两个函数中使用make_hand
。