针对欧冠16进8的抽签过程,我主要有以下几个问题:

1,一共有多少种可能的对阵?

2,两次抽签抽出相同的对阵概率有多大(多小)?

3,每种单场对阵(比方说米兰vs巴萨,皇马vs曼联)出现的概率有多少?

4,到底有没有黑幕?

先解决多少种对阵的问题。基本思路是八皇后。不同的是验证位置是否合法有效的方法。八皇后是要避免竖斜方向,抽签要避免同小组,同足协,和竖向(抽了同一支球队)。好比在一个破棋盘上摆“车”。如图就是今年的抽签结果。

画图画的,见谅。车迷不哭么么哒。

代码如下。八皇后+位运算

#define PAIR 8 //16 teams

#define FUAI 0

enum association{ITA,ESP,ENG,GER,FRA,POR,SCO,UKR,TUR}; //football associations

static const enum association as_st_1[PAIR] = {FRA,GER,ESP,GER,ITA,GER,ESP,ENG}; //standing 1, group A to H

static const enum association as_st_2[PAIR] = {POR,ENG,ITA,ESP,UKR,ESP,SCO,TUR}; //standing 2, group A to H

static char versus[PAIR] = {0};

static int count = 0; //# of possible results

int isvalid(int round, char pos){//check if the pos(ition) is valid

if((round!=pos)&&(as_st_2[round]!=as_st_1[pos])){

int i;

char c = 0;

for(i=0;i

c = c|versus[i];

}

return (c!=(c|(1<

}

return 0;

}

void draw_once(int round){

int pos;

for(pos=0;pos

if(isvalid(round,pos)){

versus[round] = (0|(1<

if(round == PAIR-1){

count++;

versus[round]=0;

return;

}

draw_once(round+1);

versus[round]=0;

}

}

}

void draw(){ //封装用的

draw_once(0);

}

void print_available_versus(){

int j;

char k;

for(j=0;j

for(k=0;k

if(isvalid(j,k)!=0){

printf("YES\t");

}else{

printf("NO\t");

}

}

printf("\n");

}

}

void main(){

if(FUAI){

printf("Milan vs Barca, RM vs ManU, qita suibian!\n");

}else{

print_available_versus();

draw();

printf("%d\n",count);

}

}

P.S. 我是不会告诉你们代码里有彩蛋的。不信你把第二行的0换成1试试。

gcc 4.6.1跑结果如下:

第一个8*8矩阵是抽签前所有可能的单场对阵。从上到下第1到8行分别代表A-H组的8个小组第二,从左到右是8个小组第一。蛋疼的同学可以验证,欧足联官网欢迎您。

5463就是所有可能的对阵了。所以你想欧组联能彩排和正式抽出一样的结果,这是什么人品。

再算每一场出现的概率。

每一场出现的概率我们可以通过累加5463种抽签对阵,统计其中单场出现的次数,除以5463得出。在这里,为了增加难度,我准备研究一下全部的抽签过程。

如果对比真实的抽签过程,前面这段代码是按照小组第二从A到H的顺序来的。真实的抽签过程可以参考(屌丝的节目 误)球迷的节日足球之夜节目转播的抽签过程(这儿下的)。

过程是这样的。

老熟人光头男因凡帝诺负责抽小组第二。给丫一个特写。

前利物浦和皇马巨星(以下简称巨星,麦克马纳曼太长了)负责抽小组第一,就是下图左一笑得很开心的那个,右一是(个小喽罗 误)欧组联竞赛总监马切蒂(according to 女主持人)。

具体过程是,光头男先抽出一个小组第二,然后马切蒂找出可能的小组第一,(巨星说快到我碗里来 误)放到巨星面前的碗里,再由巨星来抽出一个。直到全部八场对阵产生为止。

我准备先模拟全部出抽小组第二的过程,再模拟出所有可能对阵。

全部可能的小组第二抽签顺序这种问题让人菊花一紧,没错,就是您的老朋友面试的好基友全排列算法。好了少年你可以去google代码了。下面的是我(google的 误)写的(其实也还是google了一下的)。用的递归+邻位对换。

代码:

#define PAIR 8 //16 teams

enum association{ITA,ESP,ENG,GER,FRA,POR,SCO,UKR,TUR}; //football associations

static const enum association as_st_1[PAIR] = {FRA,GER,ESP,GER,ITA,GER,ESP,ENG}; //standing 1, group A to H

static const enum association as_st_2[PAIR] = {POR,ENG,ITA,ESP,UKR,ESP,SCO,TUR}; //standing 2, group A to H

static char versus[PAIR] = {0};

static int count = 0; //# of possible results

//static int st_2[PAIR] = {0,1,2,3,4,5,6,7};

static int st_2[PAIR] = {7,6,1,4,2,3,5,0}; //this year order

static int acc[PAIR][PAIR] = {0};

void swap(int* a, int* b){

int temp = *a;

*a = *b;

*b = temp;

return;

}

int isvalid(int round, char pos){//check if the pos(ition) is valid

char c = 0;

if((round!=pos)&&(as_st_2[round]!=as_st_1[pos])){

int i;

for(i=0;i

c = c|versus[i];

}

return (c!=(c|(1<

}

return 0;

}

void acc_result(){

int i,j;

for(i=0;i

for(j=0;j

acc[i][j] += ((versus[i]>>(PAIR-1-j))&1);

}

}

}

void draw_once(int round){

int pos;

int team = st_2[round];

for(pos=0;pos

if(isvalid(team,pos)){

versus[team] = (0|(1<

if(round == PAIR-1){

count++;

acc_result();

versus[team]=0;

return;

}

draw_once(round+1);

versus[team]=0;

}

}

}

void draw(){

draw_once(0);

}

void print_perm(){

int i;

for(i=0;i

printf("%d\t",st_2[i]);

}

printf("\n");

}

void perm(int m, int n){

if(m>n){

draw();

return;

}else{

int i;

for(i=m;i<=n;i++){

swap(&st_2[i],&st_2[m]);

perm(m+1, n);

swap(&st_2[i],&st_2[m]);

}

}

}

void perm_draw(){ //封装

perm(0,PAIR-1);

}

void print_available_versus(){

int j;

char k;

for(j=0;j

for(k=0;k

if(isvalid(j,k)!=0){

printf("YES\t");

}else{

printf("NO\t");

}

}

printf("\n");

}

}

void print_acc(){

int i,j;

int sum;

for(i=0;i

sum = 0;

for(j=0;j

sum += acc[i][j];

}

for(j=0;j

printf("%d\t",acc[i][j]);

}

printf("\n");

}

}

void print_acc_per(){

int i,j;

int sum;

for(i=0;i

sum = 0;

for(j=0;j

sum += acc[i][j];

}

for(j=0;j

printf("%2.1f\t",((float)acc[i][j]/sum)*100);

}

printf("\n");

}

}

void main(){

printf("\n");

print_available_versus();

perm_draw();

//draw();

printf("%d\n\n",count);

print_acc();

printf("\n");

print_acc_per();

}

P.S.这里面把彩蛋去掉了。刚才给彩蛋好评的亲请自行DIY。

最后的main里面,可以注释掉perm_draw()那一行,跑draw(),这样就能看到所有对阵里的单场对阵出现的次数和概率。比方说我跑的:

看到华丽的23.2米屌们哭了没?皇马概率最高的是抽尤文,21.8,能抽到21.5的曼联已经是人品了(0.3%的人品也是人品)。

如果少年您真心蛋疼,请注释掉draw(),跑perm_draw()吧。比方说我就蛋疼了一次:

其实概率是一样的,只是遍历了一下2亿多次不同的抽签过程而已。

至于有没有黑幕这种事,就见仁见智了。

好了今天就先到这里了我们下次节目再见。

P.S. 应该还有很多种做法,比方说固定某一场算剩下的可能对阵(ie.能不能把16层递归搞成8层),或者Monte Carlo Method(100万应该够收敛了吧,起码比2亿要快),etc。有什么其他想法欢迎来搞。

欧冠抽签程序c语言,欧冠抽签相关推荐

  1. 抽签小程序(C语言随机数),C# 抽签小程序

    设计背景 设置一个Excel名单表,对名单进行随机抽取. 设计思路 使用Timer定时器,运行定时器进行名单随机滚动,停止定时器获得抽签结果 相关技术 随机数 Excel读取/导出 XML文档读写 相 ...

  2. 求解欧拉方程的c语言,用有限体积方法求解欧拉方程

    <用有限体积方法求解欧拉方程>由会员分享,可在线阅读,更多相关<用有限体积方法求解欧拉方程(12页珍藏版)>请在人人文库网上搜索. 1.有限体积法求解二维可压缩Euler方程计 ...

  3. 欧拉梯形格式C语言,常微分方程数值解法 欧拉格式和梯形格式比较.doc

    常微分方程数值解法 欧拉格式和梯形格式比较 甥啼伐慑穗策步怀冻窿连鼓枉磷浮血腔氓玩伶樱拨惊款蹈耀突菩屠赘颧泥整抽蟹寥毋城舶败袍龙垫炯听记捅碉钠辞摆棒猩饯钒轮剂厅戎懦汝差栅寿坪赞壁洒日朵谰丛沛称怜给吟戏 ...

  4. 欧拉梯形格式C语言,常微分方程数值解法欧拉格式和梯形格式的比较.doc

    常微分方程数值解法欧拉格式和梯形格式的比较 PAGE PAGE 4 年级00000班号0000学号0000专业000姓名00000实验名称000000实验类型设计型综合型创新型实验目的或要求常微分的数 ...

  5. 隐式欧拉解常微分方程c语言,利用欧拉方法求常微分方程近似数值解.doc

    利用欧拉方法求常微分方程近似数值解,欧拉微分方程,欧拉运动微分方程,欧拉平衡微分方程,欧拉型微分方程,微分方程的欧拉算法,微分方程的欧拉解法,欧拉型常微分方程,偏微分方程数值解,微分方程数值解法 利用 ...

  6. 求解欧拉方程的c语言,用有限体积方法求解欧拉方程.doc

    PAGE 4 - 实用标准 文档 有限体积法求解二维可压缩Euler方程 --计算流体力学课程大作业 老师: 夏健.刘学强 学生: 徐锡虎 学号: SQ09018013018 日期: 2010年2月5 ...

  7. 让英文版windows 8支持非Unicode程序的语言方法

    Control Panel\Clock, Language, and Region 点击 Region change system locle 非Unicode程序的语言,只要将当前非Unicode程 ...

  8. 每日程序C语言5-斐波那契兔子数

    每日程序C语言 题目 古典问题,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后又生一对兔子,假如兔子都不死,问每个月的兔子总数是多少? 算法分析 兔子的对数符合斐波那契数列 斐 ...

  9. 每日程序C语言3-三个数大小排序

    每日程序C语言 题目 输入三个数,按照从小到大的顺序输出 算法分析 在三个数中找出最小的数 比较剩下两个数的大小 依次输出 代码 void sort(int x,int y,int z){if(x&g ...

  10. 每日程序C语言2-判断某日期是这一年的第几天

    每日程序C语言 题目: 输入某年某月某日,判断这一天是这一年的第几天? 程序分析: 闰年和平年的算法,用二维数组来存储月份和天数 核心代码 void fun(int year,int month,in ...

最新文章

  1. android获取卡号号码,Android银行卡扫描获取银行卡号
  2. 删除表中存在多条相同记录的方法
  3. Sum All Primes
  4. Linux中如何java联网,如何在Java中运行Linux命令?
  5. 有监督回归:鲁棒学习
  6. web project、web service project和java project的区别
  7. java页面间面向对象的方法面试题_JAVA面向对象面试题带答案(墙裂推荐)
  8. iBATIS In Action:什么是iBATIS(二)
  9. Spring框架(下)JdbcTemplate、声明式事务管理
  10. Struts1.2 Hibernate Spring框架组合(二)
  11. calendar类_不要再自己写 Java 工具类了,这些开源的不香吗?
  12. 给摩托罗拉C1200数字对讲机写频
  13. android手机电视下载软件安装失败,新买的电视无法安装第三方软件?方法汇总来了,解决99%的问题...
  14. Cisco NAT --- ip nat enable NVI方式
  15. IDEA 有个很牛逼的功能
  16. Word2013中用尾注添加参考文献
  17. 中山大学软件工程c语言,2017年中山大学085212软件工程考研参考书目推荐
  18. Oracle 官方学习oracle
  19. NRF24L01 使用小结—1
  20. tensorflow+python flask进行手写识别_Tensorflow训练识别手写数字0-9

热门文章

  1. 对12w条数据进行相关清理和数据迁移 (数据清理项目实战完整版)文章内有大量sql脚本
  2. 【解决方案 六】---在VS2015里使用ILDasm
  3. winrar压缩软件弹出广告解决办法
  4. 基于产生式系统方法实现动物识别系统
  5. cad详图怎么画_CAD标准图框怎么画
  6. MagicDraw-活动图
  7. 最新Android开发视频教程 Android Studio教程(2017-2018-2019)
  8. 二阶带通滤波器电路设计
  9. RS485接口的EMC设计方案
  10. 人口普查中应该具备的计算机知识,人口普查知识问答③