知乎原文
王荣的「吉占」平均能摸几张牌?
我先算一个简单版:假设每次翻牌,1 到 13 点都一样容易翻到,前面翻过什么也不影响下一张。这样算下来,平均能拿到 4.23 张左右。
1 到 6 点猜大,8 到 13 点猜小。翻到 7,两边一样,我在代码里选了猜大。点数相同也算猜错。
假如第一张翻到 A,猜大就很好猜:除了再翻到 A,其他点数都算对。可要是第一张翻到 7,猜大就只有 8 到 K 这六种点数能中。把第一张的 13 种情况都算进去,第一猜大约有 29% 的机会猜错。
猜对以后,刚翻出来的那张牌,就拿来跟下一张比。所以第二猜不能照搬第一猜的概率。把第一猜能猜中的情况列出来,再数第三张牌有哪些点数会让你猜错,算下来第二猜大约有 32% 的机会猜错。前两猜的失败率都在三成上下,我们先按每一猜有 31% 的机会结束来粗估。
这就像抛骰子,抛到 1 就停。每次抛到 1 的概率是 1/6,平均就要抛 6 次。这里也是一样:每一猜结束的概率粗略按 0.31 算,那平均就要猜 1 ÷ 0.31,也就是 3.2 次左右。
每猜一次就会翻一张牌,最后猜错的那张也算。再加上开头还没猜就翻出来的第一张,总共就是 4.2 张多一点。
python模拟代码:
import random
def predict(x):
if x <= 7:
y = 1
else:
y = 0
return y
result = []
for _ in range(10000):#多少次实验
r = random.randint(1,13)
count = 1
while True:
count += 1
p = predict(r)
r2 = random.randint(1,13)
if p==1 and r2>r:
r = r2
continue
elif p==0 and r2<r:
r = r2
continue
else:
break
result.append(count)
print(sum(result)/len(result))上面的代码模拟的是这个简化版。题主问的 161 张军争牌堆,翻出来的牌不会放回去;那就得按实际牌堆洗牌,每次看剩下的牌里,是比当前点数大的更多,还是小的更多,再决定猜哪边。