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

扑克手牌生成问题:如何移除已用卡牌避免重复使用?

解决方案:生成无重复的随机手牌

嘿,我来帮你搞定这个问题!你现在的代码每次随机选花色和点数,很容易重复,要实现每张牌只用一次,最简洁高效的方法是先构建完整的52张牌组,洗牌后直接取前n张——比每次手动移除已用牌要省心多了,而且性能更好。

核心思路步骤

  • 第一步:构建完整牌组:把所有花色和点数的组合都列出来,形成一个包含52张牌的列表。
  • 第二步:洗牌:用random.shuffle()把牌组彻底打乱,这样取前n张就是完全随机且不重复的手牌。
  • 第三步:抽取手牌:直接从洗牌后的列表里拿前n张就行,剩下的牌自动就是未使用的。

完整代码示例

import sys
import random
import stdio  # 记得导入stdio模块,对应你提到的writeln功能

def main():
    n = int(sys.argv[1])
    SUITS = ["Clubs", "Diamonds", "Hearts", "Spades"]
    RANKS = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
    
    # 构建完整的52张牌组,每张牌用元组存储(点数,花色),也可以改成字符串格式
    deck = [(rank, suit) for suit in SUITS for rank in RANKS]
    # 洗牌,原地打乱列表
    random.shuffle(deck)
    # 取前n张作为手牌
    hand = deck[:n]
    
    # 输出每张手牌,用stdio.writeln代替print
    for card in hand:
        stdio.writeln(f"{card[0]} of {card[1]}")

if __name__ == "__main__":
    main()

如果你坚持要“使用后移除已用卡牌”的方式(备选方案)

如果一定要模拟“抽一张牌就从牌组里删掉”的逻辑,也可以这样做:维护一个可用牌的列表,每次随机选一个索引,用pop()移除并取出这张牌——不过这种方法在n较大时,效率不如洗牌法(因为每次pop中间元素会移动列表元素,时间复杂度更高)。

示例代码:

import sys
import random
import stdio

def main():
    n = int(sys.argv[1])
    SUITS = ["Clubs", "Diamonds", "Hearts", "Spades"]
    RANKS = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
    
    # 构建完整牌组
    deck = [(rank, suit) for suit in SUITS for rank in RANKS]
    hand = []
    
    for _ in range(n):
        # 随机选一个可用牌的索引
        index = random.randrange(len(deck))
        # 移除并取出这张牌,加入手牌
        card = deck.pop(index)
        hand.append(card)
    
    # 输出手牌
    for card in hand:
        stdio.writeln(f"{card[0]} of {card[1]}")

if __name__ == "__main__":
    main()

额外提示

可以加个简单的参数校验,避免传入超过52的n导致报错:

if n > 52 or n <= 0:
    stdio.writeln("n必须是1到52之间的整数")
    sys.exit(1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:00:38