作者arrenwu (不是绵芽的错)
看板Math
标题Re: [机统] 鱿鱼游第五关的通关人数期望值怎麽算
时间Fri Oct 22 11:12:22 2021
※ 引述《ntpuisbest (阿龙)》之铭言:
: 如题
: 鱿鱼游戏第五关玻璃桥
: 到达终点总共要经过18块玻璃
: 而每次的经过都是两片玻璃二选一
: 选对了就是强化玻璃
: 选错了就是掉下去
: 假设选对选错的机率都是二分之一
: 然後选手总共20位好了
: 再假设每位选手都有超凡记忆力
: 都有办法记得自己前面的人经过哪些玻璃
: 而且可以趋吉避凶
: 那麽在不互相残杀的状况下
: 20位选手的期望通关人数是多少呢
: 我觉得这个问题很复杂
: 因为加入了人有记忆性这个条件後
: 感觉只有用程式模拟
: 配合大数法则才有可能算出来?
: 但是程式感觉rule也不太好写
从 Linearity of Expectation 我们可以知道,
20
通关人数的期望值 = Σ P(第 i 位选手安稳地站在第18块上)
i=1
让随机变数 X_i 代表第i位选手最终所能安稳站的玻璃
我举几个例子方便大家理解:
X_1 = 0 的意思是第1位选手死在第1块玻璃上
X_1 = 2 的意思是第1位选手死在第3块玻璃上
X_3 = 4 的意思是第3位选手死在第5块玻璃上
X_5 = 18的意思是第5位选手成功地站在第18块玻璃上
20
所以通关人数期望值就是 Σ P(X_i=18)
i=1
怎麽算这些 P(X_i=x) 呢?
P(X_1=x) = (1/2)^(x+1) , 0<=x<=17
1/2^18 , x =18
0 ,otherwise
幸运的是 X_1,X_2, ... 有 Markovianity,所以可以用下面这方式算出来:
P(X_i=x) = Σ P(X_{i-1}=y)P( X_i=x | X_{i-1}=y)
0<=y<=18
对於 i>=2, 我们有
(i) y <= 17
Pr( X_i=x | X_{i-1} = y) = (1/2)^(x-y) , y+1<=x<=17
(1/2)^(17-y) , x = 18
0 , otherwise
(ii) y = 18
Pr( X_i=x | X_{i-1} = y) = 1 , x= 18
0 , otherwise
我用程式算出来是 11 。
实际上,这其实只要算到第18个人就可以了。
因为第19跟第20个人从前面的人的结果绝对可以安全通过。
然後我通过计算发现看起来有下面这个情况
for 1<=i<=18 , P(X_i=18) + P(X_{19-i}=18) = 1
弄得更General一点,如果总共有 n 块玻璃要通过,
for 1<=i<=n, P(X_i=n) + P(X_{n+1-i}=n) = 1
如果上面那个猜想是对的,那应该有个不错的解读方式可以省下这些计算
这就交给大家想了
--
因为有大家的支持,才有角卷绵芽的Sololive
https://i.imgur.com/CbO6fr2.jpg
直到台湾时间 2021/11/12 (星期五) 下午 9:59 为止都可以在SPWN观看喔!
SPWN连结:https://spwn.jp/events/21101201-jpwatame
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 98.45.135.233 (美国)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Math/M.1634872344.A.D16.html
1F:推 fragmentwing: 推公布程式算 良心码农 10/22 12:21
2F:推 ntpuisbest : 拜读一下,感恩 10/22 13:21
3F:推 llrabel : 赞赞 跟我设的随机变数一样 10/22 13:31
4F:→ llrabel : 不过原文下已经有人给出另一个「不错的解读方式」 10/22 13:33
5F:→ llrabel : 改成用第 i 块玻璃有没有死人设随机变数 Y_i 10/22 13:36
6F:→ llrabel : Y_i = 1 表示有死, Y_i = 0 表示没有 秒杀 10/22 13:38
你们有谁方便写一篇用这方式的分析吗?XD
然後我 Python的程式码放在这边,有兴趣的可以看看
M = 18 # 玻璃数量
T = 20 # 参加者人数
# 玻璃的数量和参加者人数也可以改成其他的数字
dp = [[0]*(M+1) for _ in range(T+1)] # dp[i][x] = P(X_i=x)
for x in range(M):
dp[1][x] = 0.5**(x+1)
dp[1][M] = 0.5**M
for t in range(2,T+1):
#calculating dp[t][.]
# dp[t][M]
for y in range(0,M):
dp[t][M] += 0.5**(M-1-y)*dp[t-1][y]
dp[t][M] += dp[t-1][M]
for x in range(0,M):
for y in range(0,x):
dp[t][x] += 0.5**(x-y)*dp[t-1][y]
result = 0
for t in range(1,T+1):
result+=dp[t][M]
print(result)
7F:推 fragmentwing: 你文章死在玻璃上的举例中间两个是不是打错啦 10/22 14:02
是第一个打错XD
※ 编辑: arrenwu (98.45.135.233 美国), 10/22/2021 14:09:31
8F:→ fragmentwing: 原来如此 看懂了 很像国小的以上超过陷阱题XD 10/22 14:24