【两年前的执念】论直通春晚赛制的不合理性
昨天在搜王啸坤的歌,然后搜到了一首在声动亚洲上的歌,然后就想到了这个问题
高三的时候其实是很无聊的,好在我有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的
那么搞了这么多我想表达什么呢
其实我也不知道我想表达什么