k张牌中有m张牌做了标记,其中a张牌的一堆中有n张牌做了标记的概率是多少?

牌组中有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是计算组合的函数。解题思路如下:

  1. 从k张牌中取a张,共有C(k,a)种取法
  2. 先从m张带记号的牌中取n张,有C(m,n)
  3. 再从剩余的k-m张牌中取a-n张,有C(k-m, a-n)
  4. a张牌中有n张牌带记号的概率是(C(m,n)*C(k-m, a-n))/C(k,a)

写成代码,就是这样的:

>>> 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)