网易游戏笔试题--取不同颜色球的概率问题
有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
以下是仿真程序:
- C/C++ code
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个必须一样
[解决办法]
[解决办法]
这个题等价于:有6只球,分别是6个颜色
随意拿球后看了颜色后放回去
一共取5次
问题:
1、5次分别是5种不同颜色的概率,
2、取5次 4种不同颜色的概率,
3、取5次 3种不同颜色的概率,
4、取5次2种不同颜色的概率,
因为这样 就每次取球都是1/6
高中数学问题答案也很简单吧
提供一个方法:满足该取法的总数/任意取的总数
任意取总数当然是6^5 = 7776 如2楼
1.5种颜色比较简单啊,C(6,5)*5! = 720种概率是720/7776
2.4种同理 C(6,4)*C(4,1)*5!/2! = 3600 概率3600/7776
3.3种 C(6,3)*(C(3,1)*5!/3!+ C(3,2)*5!/2!/2!) = 3000种 概率 3000/7776
4.2种 C(6,2)*(C(2,1)*5!/4! + C(2,1)*5!/3!/2!) = 450种 概率 450/7776
当然剩下的一种颜色当然就是C(6,1) = 6 种 概率6/7776
加起来 720+3600+3000+450+6=7776 恰好所有的情况都包含在内
解释一下算总数方法:颜色 红黄蓝绿黑紫 6色
1.5颜色比较简单,一共的方法是 先挑5个颜色C(6,5),例如随意一种组合是 红黄蓝绿黑, 可以任意选择拿球顺序,也就是A(5,5) = 5! 所以 就是C(6,5)*5!
2.同样先挑4种颜色C(6,4),肯定会有重复的颜色 例如 一种颜色组合是红黄蓝绿,再挑出哪个颜色是重复的,有C(4,1)种, 例如红色是重复的,本来任意拿球顺序是5!红色重复 所以去掉红色全排列2! 最后表达式C(6,4)*C(4,1)*5!/2!【为什么要除以2! 本来顺序可以是 红1黄红2蓝绿 和 红2黄红1蓝绿 算是同一种取法,综合起来 去掉一半这样的情况就OK了)】
3.一样的道理 C(6,3)不解释,例如颜色是 红黄蓝三中 3种颜色分两种情况,一种是3个颜色重复(红红红黄蓝) 一种是3个2颜色重复(红红黄黄蓝) 再全排列 C(6,3)*(C(3,1)*5!/3!+ C(3,2)*5!/2!/2!)
4.同理,C(6,4) 2种颜色 红绿, 有两种情况 一种是14组合(红绿绿绿绿) 一种是23组合(红红绿绿绿),继续全排列C(6,2)*(C(2,1)*5!/4! + C(2,1)*5!/3!/2!)
5.简单了吧 C(6,5) 只有一种排列方法啊 (红红红红红) 没有第二种~~
[解决办法]
好东东啊,不错嗯哪
[解决办法]
做做感觉很好玩~
[解决办法]
我理解的是,相同颜色的球不做区分,取球的顺序是区分的,比如假设6种颜色分别标记为1,2,3,4,5,6,取得12345和54321应该是不一样的,算2种
[解决办法]
数学。
这题目还算简单。
Markov 马尔科夫, 状态转移概率 5/6
几种颜色的球,这些就是 对应的几种观测序列。
[解决办法]
有什么类似这种题目的算法吗?
[解决办法]
10楼正解吗?我怎么也觉得纯概率论了。。
[解决办法]
[解决办法]
这题目还不简单!
[解决办法]
请注意一下,题目已假定每种颜色的球的个数都是无限的。
[解决办法]
这个是概率统计,大一大二的数学知识,高中强一点的可能也会,so easy