三国杀Online(基于概率策略下的最大牌数期望值求解)

问题简述:

        牌库中存在两套牌,一套牌有52张(4X13),随机取一张作为库顶,从剩余牌中取一张,比大小(只能比大小),正确则继续,错误则退出。求、按照某种特定的策略,计算能打开的最大牌数N(包含已经被打开的,也就是说N>=2)。

def simulate_gaming():
    import random
    paiku = [i + 1 for i in range(13)]
    # 生成2套牌库
    for i in range(0, 2):
        paiku += paiku
    pk = paiku
    # 牌数n初始为2
    n = 2
    global de, dde
    # 初始化,准备一张顶牌
    top = pk[random.randint(0, len(pk) - 1)]
    pk.remove(top)
    while len(pk) >= 1:
        # 做决定,计算此时,下一张牌能猜对的概率
        # 牌是相同的概率为pe,下一张比这一张牌大的概率为pm,比这一张牌小的概率为pl
        pm = len([i for i in pk if i > top]) / len(pk)
        pl = len([i for i in pk if i < top]) / len(pk)
        if pm > pl:
            print("猜大")
            de = 1
        elif pm < pl:
            print("猜小")
            de = 0
        else:
            de = 100
        #由于只有大小,相等必为错,所以即使知道极端情况剩下的八张都是一样的,也只能停止

        # 从剩余的卡牌中随机抽牌
        flip = pk[random.randint(0, len(pk)-1)]
        #更新牌库,去掉这一张
        pk.remove(flip)
        # 比大小
        # step1 定义客观大小
        if flip == top:
            dde = 2
        elif flip > top:
            dde = 1
        elif flip < top:
            dde = 0
        # step2 判断正确与否
        if de == dde:
            #判断正确,牌数+1
            n+=1
        else:
            break
        top = flip
    return n

s = 0
for j in range(1, 20000):
    s += simulate_gaming()
print(s/len(range(1, 20000)))

 结果(1)    4.145107255362768

 结果(2)    4.190709535476774

上一篇:水仙花数()


下一篇:[Matlab] 绘制ROC,计算AUC