You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python扑克发牌报错:randint触发empty range for randrange()异常

解决Python扑克程序中的randint空范围错误

问题原因

你的deckSuit列表只有4个花色元素,但循环要执行5次。每次循环用pop()移除一个花色元素,第四次循环后deckSuit就被清空了。第五次循环时,len(deckSuit)-1等于-1,randint(0, -1)的范围是无效的空区间,直接触发报错。而且从扑克逻辑来说,花色是可以重复搭配不同数字的,你不该用pop()移除花色元素,这不符合真实牌局规则。

解决方案1:随机选择花色(不移除原列表元素)

用random.choice()替代pop()来选花色,这样不会修改原花色列表,每次都能正常随机选取:

import random

deckNumber = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
deckSuit = ["Spades", "Diamonds", "Clubs", "Hearts"]
playerHand = []
oppHand = []

for i in range(5):
    # 随机抽一个数字并移除(确保数字不重复)
    number = deckNumber.pop(random.randint(0, len(deckNumber)-1))
    # 随机选一个花色,不移除原列表元素
    suit = random.choice(deckSuit)
    playerHand.append(f"{number} {suit}")

print(playerHand)

解决方案2:生成完整牌组后抽牌(更符合真实扑克逻辑)

先生成包含所有52张牌的完整牌组,洗牌后再抽取,完全模拟真实牌局:

import random

deckNumber = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
deckSuit = ["Spades", "Diamonds", "Clubs", "Hearts"]
# 生成完整的52张牌
full_deck = [f"{num} {suit}" for num in deckNumber for suit in deckSuit]
random.shuffle(full_deck)  # 洗牌

playerHand = full_deck[:5]  # 取前5张给玩家
oppHand = full_deck[5:10]  # 取接下来5张给对手

print(playerHand)

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:45:30