问题简述:
牌库中存在两套牌,一套牌有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