首页 > 代码库 > 编程题 - 概率问题,抽奖问题 48选7

编程题 - 概率问题,抽奖问题 48选7

编程题 :

有12组球,每组有编号为ABCD四个球. 任意球可记为 nX (1<=n<=12 ,X ={A B C D}).随机抽取7个球.问抽到结果中,存在7个不同组的球的可能性.6个呢? 进而(5,4,3,2个的可能性)?

解题思路:
应用 编程题 -- 分组问题,输出公式(一)  中的结果,计算 grouping 7 7 4 ;grouping 7 6 4 ....
得到:

7:
7*1
6:
5*1 + 1*2 ( 解释下这个结果,后面的就自然明了. 从5个组中各抽一个球且从另一个组中抽3个球 )
5:
4*1 + 1*3
3*1 + 2*2
4:
3*1 + 1*4
2*1 + 1*2 + 1*3
1*1 + 3*2
3:
2*2 + 1*3
1*1 + 2*3
1*1 + 1*2 + 1*4
2:
1*3 + 1*4

下示C(n,m)表示从n个数的集合中抽取m个数的子集的组合数计算. pow(x,y)表示x的y次方
从48个球中抽取7个的组合数为: total = C(48,7)
抽出来7个不同组的组合数为: c7=C(12,7)*pow(C(4,1),7)
抽出来6个不同组的组合数为: c6=C(12,1)*C(4,2)*C(11,5)*pow(C(4,1),5)
抽出来5个不同组的组合数为: c5=C(12,1)*C(4,3)*C(11,4)*pow(C(4,1),4) + C(12,3)*pow(C(4,1),3)*C(9,2)*pow(C(4,2),2)
抽出来4个不同组的组合数为: c4=C(12,1)*C(4,4)*C(11,3)*pow(C(4,1),3) + C(12,1)*C(4,2)*C(11,1)*C(4,3)*C(10,2)*pow(C(4,1),2) + C(12,1)*C(4,1)*C(11,3)*pow(C(4,2),3)
抽出来3个不同组的组合数为: c3=C(12,1)*C(4,3)*C(11,2)*pow(C(4,2),2) + C(12,1)*C(4,1)*C(11,2)*pow(C(4,3),2) + C(12,1)*C(4,1)*C(11,1)*C(4,2)*C(10,1)*C(4,4)
抽出来2个不同组的组合数为: c2=C(12,1)*C(4,3)*C(11,1)*C(4,4)

 

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include "combination.h"typedef long (*Com)(long,long);Com C=combination; // 这个函数请自行网上找组合计算的实现. 这里不罗唆.int main(int argc,char** argv) {//long base=strtol(argv[1],NULL,10);//long select=strtol(argv[2],NULL,10);//printf("%ld %ld: %ld\n",base,select,combination(base,select));long total=combination(48,7); long c7=C(12,7)*pow(4,7);long c6=C(12,1)*C(4,2)*C(11,5)*pow(C(4,1),5);long c5=C(12,1)*C(4,3)*C(11,4)*pow(C(4,1),4) + C(12,3)*pow(C(4,1),3)*C(9,2)*pow(C(4,2),2);long c4=C(12,1)*C(4,4)*C(11,3)*pow(C(4,1),3) + C(12,1)*C(4,2)*C(11,1)*C(4,3)*C(10,2)*pow(C(4,1),2) + C(12,1)*C(4,1)*C(11,3)*pow(C(4,2),3);long c3=C(12,1)*C(4,3)*C(11,2)*pow(C(4,2),2) + C(12,1)*C(4,1)*C(11,2)*pow(C(4,3),2) + C(12,1)*C(4,1)*C(11,1)*C(4,2)*C(10,1)*C(4,4);long c2=C(12,1)*C(4,3)*C(11,1)*C(4,4);#define PRT(X) printf("%s : %ld : %.7lf%%\n",#X,(X),((double)(X))/total*100);PRT(total);PRT(c7);PRT(c6);PRT(c5);PRT(c4);PRT(c3);PRT(c2);printf("add up : %ld ,total: %ld\n" ,c2+c3+c4+c5+c6+c7,total);return 1;}

输出结果:

total : 73629072 : 100.0000000%
c7 : 12976128 : 17.6236474%
c6 : 34062336 : 46.2620743%
c5 : 22302720 : 30.2906439%
c4 : 4118400 : 5.5934428%
c3 : 168960 : 0.2294746%
c2 : 528 : 0.0007171%
add up : 73629072 ,total: 73629072

 

编程题 - 概率问题,抽奖问题 48选7