编程题 - 概率问题,抽奖问题 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

时间: 2024-10-18 02:36:02

编程题 - 概率问题,抽奖问题 48选7的相关文章

算法导论第2章参考答案与编程题选

系列地址:算法导论(CLRS)参考答案与配套编程题选 2.1 插入排序 练习2.1-1 原题为 \(A=<31,41,59,26,41,58>\) , 每一次排序后变化如下: 为了演示效果,所有值统一减 \(10\). 下面演示对 \(A=<21,31,49,16,31,48>\) 的排序过程: 练习2.1-2 重写为非升序排序结果如下: 点击查看大图 原文地址:https://www.cnblogs.com/accepteddoge/p/8710241.html

算法导论第1章参考答案与编程题选

系列地址:算法导论(CLRS)参考答案与配套编程题选 1.1 算法 1.1-1 例如大学生学期统计排序以分配奖学金等等. 1.1-2 例如解决问题需要使用的内存等等. 1.1-3 顺序表,优点有支持随机查找,可以在\(O(1)\)内查找元素,缺点是增添/删除元素不方便. 1.1-4 相似:都可以通过带有加权边的图来模拟解决总距离最小化问题. 不同:最短路径和旅行商问题考虑的顶点情况不同,导致复杂度不同. 1.1-5 只有最佳解才行:使用相同外观的钥匙开锁,只有正确的钥匙能打开. 获得近似解也行:

POJ C程序设计进阶 编程题#2:字符串中次数第2多的字母

编程题#2:字符串中次数第2多的字母 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一串长度不超过500个符号的字符串,输出在串中出现第2多的英语字母(大小写字母认为相同)和次数(如果串中有其它符号,则忽略不考虑).如果有多个字母的次数都是第2多,则按串中字母出现的顺序输出第1个. 例 ab&dcAab&c9defgb 这里,a 和 b都出现3次,c和d都出现2

POJ C程序设计进阶 编程题#5:细菌分组实验

编程题#5:细菌实验分组 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有一种细菌分为A.B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱.在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组. 输入 输入有多行,第一行为整数n(

不同概率的抽奖

今天为大家写个小程序. 工作中有遇到一些抽奖的活动,但是你懂得,抽奖物品的概率肯定不是一样,你会发现好的东西很难抽到,经常抽到一些垃圾的东西,嘿嘿,这就是本文要说的,我们要控制抽奖物品的概率.还有顺便说一句,网上这种小程序几乎没有,很多都是等概率的抽奖balabala- 需求很简单,为了更加形象,这里我们列一个表格来显示我们抽奖的物品和对应的概率(没有边框,大家凑合着看看吧,不想改造Octopress的样式了) 序号 物品名称 物品ID 抽奖概率 1 物品1 P1 0.2 2 物品2 P2 0.

poj 算法基础 编程题#1:UNIMODAL PALINDROMIC DECOMPOSITIONS

编程题#1:UNIMODAL PALINDROMIC DECOMPOSITIONS 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 A sequence of positive integers is Palindromic if it reads the same forward and backward. For example: 23 11 15 1 37 37 1 1

POJ 算法基础 编程题#2: 滑雪

编程题#2: 滑雪 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长的滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19

POJ C++程序设计 编程题#9:人群的排序和分类

编程题#9:人群的排序和分类 来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 总时间限制: 1000ms 内存限制: 1024kB 描述 对人群按照输入的信息进行排序和分类. #include <iostream> #include <set> #include <iterator> #include <algorithm> using namespace std; // 在此处补

POJ C程序设计进阶 编程题#4:寻找平面上的极大点

编程题#4:寻找平面上的极大点 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b; 用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内. 给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点. 编程找出所有的极大