牌组中有k张牌,其中m张做了标记。把牌组分成两堆,分别是有a张牌的牌堆A,和有(k-a)张牌的牌堆B。那么,牌堆A中的牌有n张做了标记的概率是多少?
(k>0;k>=m;m>=0;k>=a;a>=0;a>=n;m>=n;n>=0;)
回答尽量完整一些
约定从x张牌中取y张的所有可能的取法记作C(x,y),这里的C是计算组合的函数。解题思路如下:
写成代码,就是这样的:
>>> def c(x,y):
u, v = 1, 1
for i in range(y):
u *= x-i
v *= i+1
return u//v
>>> def get_probability(k, a, m, n):
return (c(m, n)*c(k-m, a-n))/c(k, a)
>>> get_probability(3, 2, 2, 1)
0.6666666666666666
>>> get_probability(30, 20, 10, 5)
0.13003847726486406
先把算法搞清楚,再去写程序,根据题意,可以这么理解:
1、总共有k张牌,m张做了记号,那么没做记号的就是c=k-m张;
2、要取a张牌,其中n张做了记号,那么没做记号的牌就是d=a-n张;
3、牌的取法,先从m张做了记号的牌里拿n张,再从c张没做记号的牌里取d张,合计a张牌;
4、那么可能的取法要用到概率公式C,可以用阶乘计算,有x=m!/(m-n)!/n!c!/(c-d)!/d!;
5、从k张里边取a张的取法有y=k!/(k-a)!/a!;
6、概率就是x/y;
7、再编写程序。
def j(p):
u=1
for i in range(1,p+1):
u=i
return u
k=int(input("输入牌的总数:"))
m=int(input("做过标记牌的数量:"))
a=int(input("牌堆A的牌数:"))
n=int(input("牌堆A中做过标记的数量:"))
c=k-m;
d=a-n;
x=j(m)/j(m-n)/j(n)*j(c)/j(c-d)/j(d);
y=j(k)/j(k-a)/j(a);
print("概率为:",x/y)