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()
关键修改说明
- createDeck优化:将
int(i/13)改为i//13,Python3中/返回浮点数,整数除法//更直接且避免类型转换的潜在问题。 - shuffleDeck重写:使用Fisher-Yates算法,倒序遍历数组,每次随机选择前面的位置交换元素,确保每张牌只会被处理一次,彻底避免重复。
内容的提问来源于stack exchange,提问作者SharkFish423
相关产品推荐
相关产品推荐

