分装备问题
概率
问题描述
假设打一个怪可能掉落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;
}