连续击中目标问题

题目:如果一个选手击中目标的概率为0.6,则选手射击20次,至少5次连续击中目标的概率是多少?

考虑更一般化的排列问题:选手射击N次,至少有M次连续击中目标的排列有多少?

连续击中的次数可以为M,也可以为M+1,...,N,正面考虑该问题,情况非常复杂,不容易确定。但如果设F(N,M)为所求的排序数,当第N次射击时,我们可做如下分析(动态规划):

1)最后一次射击在计数中起作用。也就是说,在前N-1次射击中并没有出现连击超过M次的情况,但第N射击次后出现了,这种情况只能是以下情形(F未击中,T击中,U不确定):

U…U[共N-M-1个U] FT….T[共M–1个T] T

对于前面N-M-1个U,共有多少中可能性呢?F(N,M)为N次射击中,至少出现一次M连击了次数,则N次射击中,没有一次出现M连击的可能有:2^N-F(N,M);令N=N-M-1,则N-M-1个U的可能排列有2^(N-M-1)-F(N-M-1,M),后面的排列情况是一定的,则最后一击起作用的情况有2^(N-M-1)-F(N-M-1,M)次。

2)第N次射击没有起作用。也就是说前N-1次射击中已经出现过M连击,共有F(N-1,M)次,最后一次可以击中,也可不击中,则N次射击共有2*F(N-1,M)中情况。

没有第三种可能,因此F(N,M)= 2*F(N-1,M) + 2^(N-M-1) - F(N-M-1,M),且明显有:F(N,M) = 0,如果N<M;F(N,M)=1,如果 N=M。

令f(N)=F(N,5),则有f(n) = 2*f(n-1) + 2^(n-6) - f(n-6),如果求这个递推关系的一般式子,不太清楚了。有知道的,请告诉我:)

则可以计算出f(20)=26008,很容易将递推式转到概率上,这里不再赘述。简单的程序见下面:

 1 View Code 
 2   // 射击 n 次,连续命中 m 次的可能数目
 3   int comb(int n, int m)
 4   {
 5       if (n < m)
 6           return 0;
 7       else if (n == m)
 8           return 1;
 9       else
10           return 2*comb(n - 1, m) + pow(2, n - m - 1)  - comb(n-m-1, m);
11   }
12   int check(int n, int m)
13   {
14       int ret = 0;
15       int num = pow(2, n);
16       for (int k = 0; k < num; ++k)
17       {
18           int flag = 0;
19           int current = k;
20           while (current != 0)
21           {
22               if (current % 2 == 0)
23                   flag = 0;
24               else
25                   flag++;
26               if (flag >= m)
27               {
28                   ret++;
29                   break;
30               }
31               current /= 2;
32           }
33       }
34       return ret;
35   }
36   int main()
37   {
38       for (int i = 0; i <= 20; i++)
39           cout << "i = " << i << ":  " <<  comb(i, 5) << " check: " << check(i, 5) << "/n";
40       return 0;
41   }

 

 

posted on 2011-04-02 17:03  究生  阅读(341)  评论(0)    收藏  举报

导航