登录 注册

【两年前的执念】论直通春晚赛制的不合理性

昨天在搜王啸坤的歌,然后搜到了一首在声动亚洲上的歌,然后就想到了这个问题

高三的时候其实是很无聊的,好在我有TI(当然现在其实也是很无聊的,好在我有电脑(喂这不是重点)).当然除了TI以外,最高兴的事情就是吃饭的时候顺便看看电视(喂你是高三不是小学三年级).然后由于当时一直在看好声音和声动亚洲,所以就很"自然"的去看了直通春晚.

焦点在于,倒数第二场比赛中,常石磊以几票之差输给了金池,无缘5强.当然虽然说即使石头进了5强,照样干不过平安和阿普萨萨,也干不过开挂的许艺娜,不过由于当时真的是闲得慌,所以就一直在思考这个问题:直通春晚的赛制真的合理么?

首先,我们要科普一下当年的赛制.当年是一共决出前三名可以登上春晚舞台,最终是平安,阿普萨萨,许艺娜上了.然后每场的赛制各不相同,但是基本都是偏淘汰赛的.

比如说,有一场9进5的比赛,赛制是这样的:首先各位选手演唱一首曲目,然后由评委评分,得分最低的直接淘汰.然后剩下8人中得分较高的4人抽签分两队PK.胜者晋级,败者和余下4人抽签分三组PK,每组胜者晋级,败者淘汰.

当时的场面是这样的:组内有金池,许艺娜,常石磊和孙伯纶以及炮灰5名.然后很自然的前4者得分前4,金池胜常石磊,许艺娜胜孙伯纶.看到这里我就在想,如果第三轮PK石头抽到孙伯纶不是就GG了么...不过这种.2概率的事情最后也没有发生,但是对于赛制的问题就是这时候开始想的.

那么我们可以进行一些假设:

1.选手的水平在一个区间内呈均匀分布

2.评委打分可以由选手发挥的水平直接决定

于是就有了这样一个程序:

#include<iostream>
#include<ctime>
#include<cstdlib>
#include<cmath>
using namespace std;
int randint(int low,int top){
	return floor(low+(1.0*rand()/RAND_MAX)*(top-low+1));
};
int compare(const void *a, const void *b){
    int *pa=(int*)a;
    int *pb=(int*)b;
    return (*pa)-(*pb);
};
int main(){
	srand(unsigned(time(0)));
	for (int aaa=0;aaa<20;aaa++){
		int low[]={1,2,3,4,5,70,80,90,99};
		int high[]={2,3,4,5,6,80,90,100,100};
		int sc[]={0,0,0,0,0,0,0,0,0};
		int four[]={0,0,0,0};
		int five[]={0,0,0,0,0};
		int tt_1=0,tt_2;
		for (int i=0;i<9;i++){
			sc[i]=randint(low[i],high[i]);
			if (sc[tt_1]>sc[i])tt_1=i;
		}
	//	cout<<"第一轮淘汰:"<<tt_1<<"\n";
		for (int i=0;i<4;i++){
			tt_2=0;
			for (int k=0;k<9;k++){
				if (sc[k]>sc[tt_2]){
					tt_2=k;
				}
			}
			four[i]=tt_2;
			sc[tt_2]=0;
	//		cout<<tt_2<<"进入第二轮"<<"\n";
		}
		tt_2=randint(1,3);
	//	cout<<four[0]<<"与"<<four[tt_2]<<"PK,";
		if (randint(low[four[0]],high[four[0]])>randint(low[four[tt_2]],high[four[tt_2]])){
	//		cout<<four[0]<<"胜\n";
			five[0]=four[0];
		}else{
	//		cout<<four[tt_2]<<"胜\n";
			five[0]=four[tt_2];
		}
		if (tt_2==1){
			four[0]=four[2];
			four[1]=four[3];
		}else if(tt_2==2){
			four[0]=four[3];
		}else{
			four[0]=four[2];
		}
	//	cout<<four[0]<<"与"<<four[1]<<"PK,";
		if (randint(low[four[0]],high[four[0]])>randint(low[four[1]],high[four[1]])){
	//		cout<<four[0]<<"胜\n";
			five[1]=four[0];
		}else{
	//		cout<<four[1]<<"胜\n";
			five[1]=four[1];
		}
		for (int i=0;i<9;i++){
			sc[i]=1;
		}
		sc[tt_1]=0;
		sc[five[0]]=0;
		sc[five[1]]=0;
	//	cout<<"第三组PK开始\n";
		for (int i=0;i<3;i++){
			for (int k=0;k<2;k++){
				int m;
				do{
					m=randint(0,8);
				}while (sc[m]==0);
				four[k]=m;
				sc[m]=0;
			}
	//		cout<<four[0]<<"与"<<four[1]<<"PK,";
			if (randint(low[four[0]],high[four[0]])>randint(low[four[1]],high[four[1]])){
	//			cout<<four[0]<<"胜\n";
				five[i+2]=four[0];
			}else{
	//			cout<<four[1]<<"胜\n";
				five[i+2]=four[1];
			}
		}
		qsort(five,5,sizeof(int),compare);
		for (int i=0;i<5;i++){
			cout<<five[i]<<"\t";
		}
		cout<<"\n";
	}
	return 0;
}
运行结果:

可以看出,在实力差距很悬殊的情况下,结果相对是比较稳定的.那么如果我们缩小实力的差距:

		int low[]={1,2,3,4,50,70,60,90,99};
		int high[]={2,3,4,5,100,80,90,100,100};
这样的话,就会这样:

可以看出,56号是否晋级开始胶着.不过由于456实力的期望值相同,因此我们要把他们改成不同的

		int low[]={1,2,3,4,50,50,50,90,99};
		int high[]={2,3,4,5,100,80,90,100,100};

可以看到,6甚至有一次把7逆袭了.不过这不是重点,但是总体而言6的晋级几率还是大于5的




那么搞了这么多我想表达什么呢

其实我也不知道我想表达什么

2015
05 12
上一篇
Older
下一篇
Newer
评论
0
点击
1931
发布
我是标题
我是文字
我是标题
我是文字
用户名
密码
用户名
密码
重复密码
努力的加载中.....