请选择 进入手机版 | 继续访问电脑版

俗人斋

搜索
热搜: 建站
这里是一个私人的根据地,想进入小圈子的就快来注册吧!
立即注册

合作站点账号登陆

快捷导航
查看: 18|回复: 2

[随想杂谈] [连胜杀手]好久没写代码解决问题了

[复制链接]

62

主题

560

帖子

1万

积分

时空穿梭

High Templar

Rank: 8Rank: 8

积分
18332

千山暮雪霜寒仙境七彩神话论坛元老星尘契约长乐未央亘古刻痕任我心意星际争霸II人理存续暗黑破坏神IIIDotA2PhotoshopAfter EffectPremiereAuditionDreamweaverMayaNuke冰雪学徒紫玉慕君长空白隼柠檬飞天刺客信条

威望
3498
金钱
7044
贡献
3702
QQ
透明的星尘 发表于 2020-11-17 14:08:27 | 显示全部楼层 |阅读模式
本帖最后由 透明的星尘 于 2020-11-17 14:08 编辑

和同学聊KPL比赛,有个队一直在终结别人的连胜,但是本身挺菜的。然后我们就假设存在这么一个队伍X,遇到2连胜及以上的队伍必胜,遇到没有连胜的队伍就必败,那么这个队伍在整个系列赛里的胜率是多少?
这里假设队伍无限多,场次随机,可以大概推测出X胜率是25%。X遇到一个队伍,这个队伍连胜的概率就是50%*50%=25%。但是实际上KPL只有16个队伍,这个概率会因为比赛一开始所有队伍都不可能连胜而降低。但是我想不到比较合适的数学算法了,于是干脆写了个程序模拟这个问题了。

  1. #include <iostream>
  2. #include <ctime>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;

  6. #define TotalTeam 300 //总参赛队伍数
  7. #define TestTime 1000 //模拟系列赛次数
  8. #define Pwin 50 //强队打弱队胜率

  9. int rm(){
  10.    
  11.     return rand()%10000;
  12. }

  13. struct vesus{
  14.     int left;
  15.     int right;
  16.     int sorttag;
  17. };//一个单场对局的结构体

  18. bool compare(vesus a, vesus b){
  19.     return a.sorttag<b.sorttag;
  20. }

  21. int allmatch(){
  22.     vector<vesus> match;
  23.     for(int i=0;i<TotalTeam-1;i++){
  24.         for(int j=i+1;j<TotalTeam;j++){
  25.             vesus temp;
  26.             temp.left=i;
  27.             temp.right=j;
  28.             temp.sorttag=rm();
  29.             match.push_back(temp);
  30.         }
  31.     }
  32.     sort(match.begin(),match.end(),compare);
  33.    
  34.     int vv[TotalTeam]={0};//用于记录每个队伍连胜次数的数组,但是0号是队伍X的总胜场。
  35.     for(int i=0;i<match.size();i++){
  36.         if(match[i].left==0){//如果对局里有连胜杀手
  37.             if(vv[match[i].right]>=2){ //如果遇到连胜的队伍
  38.                 vv[0]+=1;
  39.                 vv[match[i].right]=0;
  40.             }
  41.             else{
  42.                 vv[match[i].right]+=1;
  43.             }
  44.         }
  45.         else{//如果对局里没有连胜杀手,按照胜率随机分配胜负。
  46.             if(rm()<Pwin*100) {
  47.                 vv[match[i].right]=0;
  48.                 vv[match[i].left]+=1;
  49.             }
  50.             else{
  51.                 vv[match[i].right]+=1;
  52.                 vv[match[i].left]=0;
  53.             }//获胜则连胜+1,失败则连胜清零。
  54.         }
  55.     }
  56.     return vv[0];
  57. }

  58. int main(int argc, const char * argv[]) {
  59.     srand(int(time(0)));
  60.     int sum=0;
  61.     for(int i=0;i<TestTime;i++){
  62.         int temp=allmatch();
  63.         sum+=temp;
  64.     }
  65.     cout<<"Number of Teams:"<<TotalTeam<<endl;
  66.     cout<<"Pwin of Str Team:"<<Pwin<<"%"<<endl;
  67.     cout<<"Pwin of TeamX:"<< double(sum)*100/TotalTeam/TestTime <<"%"<<endl;
  68.     return 0;
  69. }
复制代码
运行了一下,大概模拟1000次左右概率波动就很小了。如果是16个队伍的话,运行结果如下:
  1. Number of Teams:16
  2. Pwin of Str Team:50%
  3. Pwin of TeamX:20.8188%
复制代码
32个队伍的话:
  1. Number of Teams:32
  2. Pwin of Str Team:50%
  3. Pwin of TeamX:22.6844%
复制代码
300个队伍的话:
  1. Number of Teams:300
  2. Pwin of Str Team:50%
  3. Pwin of TeamX:24.6707%
复制代码
因为一开始不可能连胜,会拉低队伍X的胜率,但随着队伍数量的增多,胜率也开始接近25%了。看来一开始的感觉是没有问题的。

如果强队打弱队胜率不是50%的话,我当时的直觉感觉X的胜率会降低,但结果并不是这样,比如我直接把胜率逐渐提升:
  1. Number of Teams:100
  2. Pwin of Str Team:100%
  3. Pwin of TeamX:32.245%

  4. Pwin of Str Team:90%
  5. Pwin of TeamX:29.208%

  6. Pwin of Str Team:80%
  7. Pwin of TeamX:27.205%

  8. Pwin of Str Team:70%
  9. Pwin of TeamX:25.837%

  10. Pwin of Str Team:60%
  11. Pwin of TeamX:24.635%
复制代码
可以看到,随着胜率的提升,X的胜率也在提升。我这里只能只觉得觉得,有强弱差距更容易出现连胜这个现象。比如X遇到排名第一的队伍,拿么肯定能赢,如果遇到最后一名的队伍,则必败,这样胜率是50%,实际上没有那么极端的话,也会高于25%,不过还没有太精确的数学方法解释这个现象。

是不是太较真了点><
用科学造福社会,
用艺术渲染人生。
回复

使用道具 举报

5

主题

13

帖子

1556

积分

磐石

Rank: 4

积分
1556

七彩神话

威望
197
金钱
932
贡献
217
学徒Chris 发表于 2020-11-17 15:33:07 来自手机 | 显示全部楼层
没错吧,改变胜率就是改变了连胜出现的概率分布,X队的胜率其实被定义成了基本等价于连胜的出现概率了
回复

使用道具 举报

62

主题

560

帖子

1万

积分

时空穿梭

High Templar

Rank: 8Rank: 8

积分
18332

千山暮雪霜寒仙境七彩神话论坛元老星尘契约长乐未央亘古刻痕任我心意星际争霸II人理存续暗黑破坏神IIIDotA2PhotoshopAfter EffectPremiereAuditionDreamweaverMayaNuke冰雪学徒紫玉慕君长空白隼柠檬飞天刺客信条

威望
3498
金钱
7044
贡献
3702
QQ
 楼主| 透明的星尘 发表于 2020-11-17 17:35:42 来自手机 | 显示全部楼层
学徒Chris 发表于 2020-11-17 15:33
没错吧,改变胜率就是改变了连胜出现的概率分布,X队的胜率其实被定义成了基本等价于连胜的出现概率了 ...

主要是我一开始直觉认为,强队胜率高会导致X胜率降低,但也没有依据。从结果看是反过来的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|俗人斋

GMT+8, 2020-11-26 01:21 , Processed in 0.047758 second(s), 19 queries .

Copyright © 2018 俗人斋 | Ellie Zheng

Powered by Discuz! X3.4 & Legend of 7 Colors

快速回复 返回顶部 返回列表