Boss掉落物品问题
原问题是这样的:
玩某游戏中,一个Boss死亡之后会随机掉落物品,一共有四种物品可能会掉落,Boss每次死亡之后都会掉落一种物品,四种物品掉落的概率完全相同。
现在需要收集其该Boss掉落的四件物品,完成某项任务。问:平均要杀死该Boss多少次才能凑满全部4个物品。
该问题实际上就是求boss掉落全部四个物品的数学期望,数学期望为值和概率之积的全和。
即
s=4*p(4) + 5*p(5) + … + n*p(n);
问题的关键就在于如何求解p(n);
很明显,p(n)的值为刚好在第n次杀死boss的时候掉落出最后一件物品,之前的n-1次都是掉落其他3种物品,这样才符合题意。
于是: 其中ps表示“挑出的3种物品在前n-1个事件发生时候的出现的可能排列数”,他必须满足1、三种物品必须全部出现;2、不能重复计算出现过的情况;
于是讨论这个子问题:前n-1个事件中,恰好出现三种物品的排列数
有三种可能:
1、全部是一种物品: 共3种排列
第三种情况恰好就是我们子问题的解
然后利用分项错开计算。计算无穷小数列的值。
最后可得:期望值为8.33左右
附上代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//一个BOSS掉4个装备,每杀死次BOSS都只掉1个,
//4个装备掉的几率相等,问同一玩家要凑齐4个装备平均要杀多少次BOSS?
namespace Boss
{
class Program
{
static Random rd = new Random();
static bool test(int[] a)
{
for (int i = 0; i < a.Length; i++)
{
if (a[i] != 1)
return true;
}
return false;
}
static int sim()
{
int[] a = {0,0,0,0};
int i = 0;
while (test(a))
{
a[rd.Next(0, 4)] = 1;
i++;
}
return i;
}
static void boss1()
{
double sum = 0, summ = 0;
int COUNT = 1000000;
for (int j = 0; j < 10; j++)
{
for (int i = 0; i < COUNT; i++)
{
sum += sim();
}
sum /= COUNT;
summ += sum;
}
Console.WriteLine("平均结果是:{0};", summ / 10);
}
static void boss3()
{
double s1 = 27.0 / 64, s2 = 3.0 / 8, s3 = 3.0 / 64;
double tmp=4*(s1-s2+s3),s=0;
for(int i=5;tmp>0.00001;i++)
{
s += tmp;
s1 = s1 * 3 / 4;
s2 = s2 / 2;
s3 = s3 / 4;
tmp = i * (s1 - s2 + s3);
}
Console.WriteLine("计算和:{0}", s);
}
static void Main(string[] args)
{
Console.WriteLine("模拟输出:");
boss1();
Console.WriteLine("计算输出:");
boss3();
}
}
}
![](http://www.cnblogs.com/images/cnblogs_com/hanyulcf/%E7%96%AF%E7%8B%82%E8%B6%B3%E7%90%83.jpg)