一个简单的洗牌算法实现 Python

为一副去掉大小王的52张扑克设计洗牌算法,思想如下:
1. cut牌:随机选取一个cut点,位于cut点下方的牌保持顺序不变全部移到cut点上方牌的上部,此时cut点位于牌的末尾。
2. 叠插牌: 将扑克牌分为相等的两堆,选取其中一堆,保持顺序依次插入到另一堆的两牌之间

import random
#返回一个拥有52张扑克的列表
def newPack():
    return list(range(1,53))

#cut牌,本质上就是列表左移
def MirrorP(p,start,end):
    while start < end:
        tmp = p[start]
        p[start] = p[end]
        p[end] = tmp
        
        start += 1
        end -= 1
def cutPack(p):
    length = len(p)
    cutPoint = random.randint(1,length)   #select any card
    if cutPoint > 1:
        MirrorP(p,0,cutPoint-2)
        MirrorP(p,cutPoint-1,length-1)
        MirrorP(p,0,length-1)
    return p

#叠插牌
#method1 
def shufflePack(p):
    length = len(p)
    i = 1
    
    if length % 2 == 0:
        j = length//2
    else:
        j = length//2+1
        
    while j < length:
        t = p[j]
        k = j
        while k >= i:
            p[k] = p[k-1]
            k -= 1
        p[i] = t
        j += 1
        i += 2
#method2
def shufflePack(p):
    length = len(p)
    i = 1
    
    if length % 2 == 0:
        j = length//2
    else:
        j = length//2+1
        
    t = p[j:]
    p[::2] = p[:j]
    p[1::2] = t

#结合多种方法随机打乱牌的顺序
def randomShuffle(p):
    times = random.randint(1,16)
    for i in range(times):
        cutPack(p)
        shufflePack(p)

#数字和牌花色的映射
#S、H、D、C 代表四个花色
def card(i):
    #calculate suit
    suit_dict = {0:'S',1:'H',2:'D',3:'C'}
    result = [suit_dict[(i-1)//13]]
    
    if (i+2) % 13 == 0:
        result.insert(0,"J")
    elif (i+1) % 13 == 0:
        result.insert(0,"Q")
    elif i % 13 == 0:
        result.insert(0,"K")
    elif i % 13 == 1:
        result.insert(0,"A")
    else:
        result.insert(0,str(i%13))
        
    return "".join(result)


cards = newPack()
randomShuffle(cards)
for item in cards:
    print(card(item),end = " ")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值