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

Python新手求助:不使用random.shuffle实现无重复52张牌洗牌

修改方案:实现无重复的扑克牌洗牌(禁用random.shuffle)

问题根源

你的shuffleDeck函数逻辑存在错误:直接用deck[i] = deck[num]会覆盖当前位置的原始牌面,且随机选中的num可能重复,导致大量牌面重复,同时丢失原本的不重复牌。

解决方法:实现Fisher-Yates洗牌算法

这是经典的原地洗牌算法,无需依赖random.shuffle,能保证每张牌仅被随机交换一次,最终输出52张不重复的洗牌结果。

修改后的完整代码

import random

def main():
    createDeck()
    shuffleDeck()
    printDeck()

deck = ['A'] * 52

def createDeck():
    suits = [" Heart", " Spades", " Clover", " Diamonds"]
    cardsHeld = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"]

    for i in range(len(deck)):
        # 用整数除法//替代float转int,避免精度问题
        deck[i] = cardsHeld[i % 13] + suits[i // 13] 

def shuffleDeck():
    # Fisher-Yates洗牌:从后往前遍历,每次交换当前元素与前面随机位置的元素
    for i in range(len(deck)-1, 0, -1):
        # 生成0到i之间的随机整数(包含i)
        rand_idx = random.randint(0, i)
        # 交换当前位置和随机位置的牌
        deck[i], deck[rand_idx] = deck[rand_idx], deck[i]

def printDeck():    
    for card in deck:    
        print(card)   

main()        

关键修改说明

  1. createDeck优化:将int(i/13)改为i//13,Python3中/返回浮点数,整数除法//更直接且避免类型转换的潜在问题。
  2. shuffleDeck重写:使用Fisher-Yates算法,倒序遍历数组,每次随机选择前面的位置交换元素,确保每张牌只会被处理一次,彻底避免重复。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:50:47