分装备问题
概率
问题描述
假设打一个怪可能掉落n种装备,其概率分别为
p1,p2,p3...pn
,假设
∑nk=1pi=1
,则玩家收集齐n个装备需要打怪的期望次数x为多少?
求解思路
设第一个掉落的装备为
ki
时期望为
Ei
,最终需要求的期望为
E
。
E=f(P)
E=∑i=1npi∗Ei
Ei=1+(11−pi∗f(norm(P−pi)))
其中 f 表示在概率分布为 P 的情况下求解 E 的方程, norm(P−pi) 表示概率集合 P 剔除 pi 后的归一化概率概率集合。
解释
对于
Ei
,由于已经确定第一个掉落的是装备
ki
,因此其值至少为1.再假设从此以后不再掉落装备
ki
,则集齐剩余部分的期望
Ee=f(norm(P−pi))
。再考虑有掉落
ki
的情况下,实质上相当于在不掉落k_i的情况下下每次以
pi
的概率插入一个装备,其值为
pi∗Ee
。对这部分插入的装备,又会以
pi
的概率插入装备k,其值为
p2i∗Ee
,不断递推,可以得到最终公式
Ei=(1+pi+p2i...pni)∗Ee=1−pni1−pi∗Ee
,当n趋于无穷时可以得到
Ei=1+(11−pi∗Ee)
得到 Ei 后即可推算出 E 。
程序
double solve(vector<double>& p)
{
if(p.size() == 1)
return 1/p[0];
double ret = 0.0;
for(int idx = 0; idx < p.size(); ++idx)
{
swap(p[idx], p[0]);
vector<double> temp(p.begin()+1, p.end());
double sum =accumulate(temp.begin(), temp.end(), 0.0);
transform(temp.begin(), temp.end(), temp.begin(), [&sum](double x){return x/sum;});
ret += p[0]*(1+1.0/(1-p[0])*solve(temp));
}
return ret;
}