首页 > 试题广场 >

数理逻辑

[问答题]
一个BOSS掉5件装备,每件装备掉落的概率为0.2,每次只能掉一件装备,且5件互为掉落互斥,凑齐一套装备需要击杀BOSS的期望次数?
由于我们不关心物品的先后顺序,我们可以抽象为6个状态
状态1:0件物品
状态2:1件物品
状态3:2件物品
状态4:3件物品
状态5:4件物品
状态6:5件物品
由状态1 转移到状态2 的概率是100%
由状态2 转移到状态3 的概率是 80%
由状态3 转移到状态4 的概率是 60%
由状态4 转移到状态5 的概率是 40%
由状态5 转移到状态6 的概率是 20%
由于期望次数 = 1 / 概率
由于期望的累加性,所以从状态1 转移到状态6 需要的期望次数是
 
最后化简得到 
-----------------------------------------------------------------我是分割线
期望次数 = 1 / 概率
证明如下(图片是从我的CSDN博客拿的)

发表于 2020-04-19 13:13:04 回复(0)
把5件装备分开来看,算出每件装备的期望,然后求和:
    第一件装备:任意击杀必然可以获得期望的装备,期望为1;
    第二件装备:4/5概率击杀获得期望的装备,期望为5/4;
    第三件装备:3/5概率击杀获得期望的装备,期望为5/3;
    第四件装备:2/5概率击杀获得期望的装备,期望为5/2;
    第五件装备:1/5概率击杀获得期望的装备,期望为5/1;
5件装备不必要关注获取顺序,只需要关注5件中已经获取了几件
所以最终结果是1 + 5/4 + 5/3 + 5/2 + 5/1 = 11+5/12 = 137/12
发表于 2020-03-25 16:05:45 回复(0)
137/12,约为11.4166667

------------------------------------------------------------------------------

这是非常经典的 马尔可夫链中的期望问题 。
先画图理解一下问题:
一开始在状态0,表示没有装备,
第1次打,一定会获得一件装备,100%进入状态1(有1件装备)
第2次打,20%概率拿了之前一样的装备,停留在状态1,80%概率拿了不一样的装备,进入状态2(有2件不一样的装备)
以此类推,直到状态5,凑齐一套装备,为终结状态。

----------------------------------------

那么,进入状态5的期望步数怎么计算呢?
面对这类问题,固定套路:
设E(x)为从状态x到终结状态的期望步数。

注意这里是故意反过来的,是状态x到终结状态的期望步数,不是初始状态到状态x的期望步数)

显然有E(5)=0(在终结状态,不需要采取任何操作)
那么,E(4)= 0.2*E(5) + 0.8*E(4) + 1
(期望有可加性,对0.2*E(5) + 0.8*E(4) 不做解释,+1因为我们用1步操作来试着状态转移一下)
以此类推,可得到方程组:
E(0) = E(1) + 1
E(1) = 0.2*E(1) + 0.8*E(2) +1
E(2) = 0.4*E(2) + 0.6*E(3) +1
E(3) = 0.6*E(3) + 0.4*E(4) +1
E(4) = 0.8*E(4) + 0.2*E(5) + 1
E(5) = 0

求解方程组,可得:E(0) = 137/12,E(1)=125/12, E(2) = 55/6, E(3) = 15/2, E(4) = 5

故答案为137/12=11.416666......

--------------------------------------------

提供以下Python模拟程序,供各位验证上述结论:
import numpy as np
from random import choices
from statistics import mean

class State(object):

    def __init__(self,state_id):
        self.transition_matrix = np.array([
            [0, 0, 0, 0, 0, 0],
            [1, 0.2, 0, 0, 0, 0],
            [0, 0.8, 0.4, 0, 0, 0],
            [0, 0, 0.6, 0.6, 0, 0],
            [0, 0, 0, 0.4, 0.8, 0],
            [0, 0, 0, 0, 0.2, 1],
        ])  # 转移矩阵
        self.state_id = state_id  # 状态ID: 状态1的ID为0

    def move(self):
        candidates = range(0, 6)  # 转移目标
        weights = self.transition_matrix[:, self.state_id]  # 转移概率
        result = choices(candidates, weights)  # 产生随机转移结果
        return State(result[0])
    
if __name__ == '__main__':
    e = 100000  # 试验次数
    r = []  # 试验结果
    for i in range(0,e):
        cur_state = State(0)  # 初始状态: 状态1
        count = 0  # 转移次数
        while cur_state.state_id != 5:
            cur_state = cur_state.move()
            count += 1
        r.append(count)  # 记录结果
    print(mean(r))  # 输出均值

-----------------------------------------------------

说来惭愧,在学校里没学懂这个东西怎么求,
现在虽然工作了,可能用不到了,但是还是翻了一下,找到了一篇比较好懂的讲解:https://zhuanlan.zhihu.com/p/52380942
可算学会了这种马尔科夫链的求解方法,反过来设方程,一切迎刃而解。
发表于 2019-12-18 01:11:25 回复(0)
1/0.5=2  1/0.4=2.5  1/0.3=3.3  1/0.2=5   1/0.1=10
所以2+3+4+5+10=24次
发表于 2019-08-26 22:11:28 回复(0)