分装备问题

来源:互联网 发布:学java工程师 编辑:程序博客网 时间:2024/05/19 16:33

分装备问题

概率


问题描述
假设打一个怪可能掉落n种装备,其概率分别为p1p2p3...pn,假设nk=1pi=1,则玩家收集齐n个装备需要打怪的期望次数x为多少?


求解思路
设第一个掉落的装备为ki时期望为Ei,最终需要求的期望为E

E=f(P)

E=i=1npiEi

Ei=1+(11pif(norm(Ppi)))

其中f表示在概率分布为P的情况下求解E的方程,norm(Ppi)表示概率集合P剔除pi后的归一化概率概率集合。


解释
对于Ei,由于已经确定第一个掉落的是装备ki,因此其值至少为1.再假设从此以后不再掉落装备ki,则集齐剩余部分的期望Ee=f(norm(Ppi))。再考虑有掉落ki的情况下,实质上相当于在不掉落k_i的情况下下每次以pi的概率插入一个装备,其值为piEe。对这部分插入的装备,又会以pi的概率插入装备k,其值为p2iEe,不断递推,可以得到最终公式Ei=(1+pi+p2i...pni)Ee=1pni1piEe,当n趋于无穷时可以得到

Ei=1+(11piEe)

得到Ei后即可推算出E


程序

  1. double solve(vector<double>& p)
  2. {
  3. if(p.size() == 1)
  4. return 1/p[0];
  5. double ret = 0.0;
  6. for(int idx = 0; idx < p.size(); ++idx)
  7. {
  8. swap(p[idx], p[0]);
  9. vector<double> temp(p.begin()+1, p.end());
  10. double sum =accumulate(temp.begin(), temp.end(), 0.0);
  11. transform(temp.begin(), temp.end(), temp.begin(), [&sum](double x){return x/sum;});
  12. ret += p[0]*(1+1.0/(1-p[0])*solve(temp));
  13. }
  14. return ret;
  15. }
0 0
原创粉丝点击