网易游戏笔试题--取不同颜色球的概率问题
有6种不同颜色的球,分别记为1,2,3,4,5,6,每种球有无数个。现在取5个球,求在以下的条件下:
1、5种不同颜色的球,
2、4种不同颜色的球,
3、3种不同颜色的球,
4、2种不同颜色的球,
它们的概率。
每种球有无数个,是指无论已经取出了多少个球,每一次再取球的时候,取到每种颜色球的概率是一样的,都是P=(1/6)
第一问:取5种不同颜色的球的概率
取5次,每次取的颜色要跟前面所有次取的颜色不一样。第一次任取1球,P1=1,第二次取剩余的5种颜色的球,P2=(5/6),...,
P3=(4/6),P4=(3/6),P5=(2/6)
总的概率P=P1*P2*P3*P4*P5
后面的几问也可以这么考虑,但要考虑相同颜色的球要在哪几次之后取得,这样做太麻烦了
有更好的方法吗????
[解决办法]
我给出的解法可能也不是最简单的,因为每个公式要用到上一次的结果。
我们把5次取球看成是5个进制位,不同颜色看成是不同进制位能出现的不同数字限制,可以看成是几进制,而球的颜色则表示用何种颜色的球去表示进制位。
设只出现x种颜色的取法为G(x),有(注意进制位数固定为5):
只出现一种颜色
G(1) = C(6,1) * 1 = 6 记 F(1) = 1
6种颜色任取1种表示进制位,1进制,进制所有bit都是0,只有一种表示法
只出现两种颜色
G(2) = C(6,2) * ( 2^5 - C(2,1)*F(1) ) = 450 记 F(2) = ( 2^5 - C(2,1)*F(1) ) = 30
6种颜色任取2种表示进制位,2进制所有的可能为2^5,排除掉只出现1种bit的情况
只出现三种颜色
G(3) = C(6,3) * ( 3^5 - C(3,2)*F(2) - C(3,1)*F(1) ) = 3000
记 F(3) = ( 3^5 - C(3,2)*F(2) - C(3,1)*F(1) ) = 150
6种颜色任取3种表示进制位,3进制所有的可能为3^5,排除掉只出现2种bit和1种bit的情况
只出现四种颜色
G(4) = C(6,4) * ( 4^5 - C(4,3)*F(3) - C(4,2)*F(2) - C(4,1)*F(1) ) = 3600
记F(4) = ( 4^5 - C(4,3)*F(3) - C(4,2)*F(2) - C(4,1)*F(1) ) = 240
只出现五种颜色
G(5) = C(6,5) * ( 5^5 - C(5,4)*F(4) - C(5,3)*F(3) - C(5,2)*F(2) - C(5,1)*F(1) ) = 720
这个结果和直接计算6*5*4*3*2是一致的。
总的取法是6^5 = 7776,用G(x)除以它就是所求概率。
[解决办法]
反过来思考。我们现在有五个球,分别丢到六个盒子里,有多少种可能。第一个球你可以有六个选择,第二个六个...所以我们得到了S = 6*6*6*6*6;
1.他们在五个盒子的可能:p5 = 6*5*4*3*2/S;
2.四个:6*5*4*3*4/S;
3.三个:6*5*4*3*3/S;
4.二个: 6*5*2*2*2/S;
5.一个:6*1*1*1*1/S;
不知道这么理解对不对。
[解决办法]
以第二题举例。
首先从六种颜色中选择4种颜色的方法是C(6, 4)
然后,从4个格子中,放5个球,并且没有空格的方法是:
将两个球看成一组,然后全排列,为C(5,2)P(4, 4)
所以总的方法是C(6, 4) * C(5, 2) * P(4, 4) = 3600
以下是仿真程序:
int SelectCnt = 0;int CalcDiffColorCnt(int* Ball){ int i; int ColorMask[6]; for(i = 0; i < 6; i++) { ColorMask[i] = 0; } for(i = 0; i < 5; i++) { int ColorID = Ball[i]; ColorMask[ColorID]++; } int ColorCnt = 0; for(i = 0; i < 6; i++) { if(ColorMask[i] > 0) ColorCnt++; } return ColorCnt;}void SelectBall(int* Ball, int Pos){ if(Pos == 0) { int j; for(j = 0; j < 6; j++) { Ball[Pos] = j; if(CalcDiffColorCnt(Ball) == 4) { SelectCnt++; cout << SelectCnt << endl; } } return; } int i; for(i = 0; i < 6; i++) { Ball[Pos] = i; SelectBall(Ball, Pos - 1); }}int _tmain(int argc, _TCHAR* argv[]){ int Ball[5]; SelectBall(Ball, 4); return 0;}
[解决办法]
前面的大家都理解有问题,从题目看相同颜色的球是不作区分的。由组合数学知识可以知道,总的取得方案数为C(6+5-1,5)=C(10,5),于是有下面的答案
1、C(6,5)/ C(10,5)
2、C(6,4)×C(4,1)/ C(10,5)
3、C(6,3)×(C(3,1)+C(3,2))/ C(10,5)
4、C(6,2)×(C(2,1)+C(2,1))/ C(10,5)
[解决办法]
纯概率论,任意取,有 6^5 = 6*6*6*6*6 种情况
5种都不同的取法 6! = 6*5*4*3*2
4种都不同, 6*5*4*3 *4 前4个都必须不同,最后1个4取1
3种不同, 6*5*4 *3*3 全3个都必须不同,后2个3取1
2种不同,6*5 *2*2*2 全2个必须不同,后3个2取1
还有1种颜色, 6 *1*1*1*1 第1个球任意,后面5个必须一样
[解决办法]