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种物品,这样才符合题意。

于是:1  其中ps表示“挑出的3种物品在前n-1个事件发生时候的出现的可能排列数”,他必须满足1、三种物品必须全部出现;2、不能重复计算出现过的情况;

于是讨论这个子问题:前n-1个事件中,恰好出现三种物品的排列数

有三种可能:

1、全部是一种物品:   共3种排列

2、恰好由两种物品构成: 共2

3、恰好有三种物品构成 : 3

 

第三种情况恰好就是我们子问题的解

 

所以:4

 

 

然后利用分项错开计算。计算无穷小数列的值。

 

最后可得:期望值为8.33左右

 

 

 

附上代码:

 

代码
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();
}
}
}

 

 

 

posted @ 2010-03-31 00:55  elite_lcf  阅读(3710)  评论(12编辑  收藏  举报
知识共享许可协议
本博客采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。