本文主要是介绍第三届蓝桥杯--夺冠概率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
夺冠概率
题目
足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。
假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
数据含义:甲对乙的取胜概率为0.1,丙对乙的胜率为0.3,…
现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。
请你进行10万次模拟,计算出甲队夺冠的概率。
注意:
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。
请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
题目分析
1.题目需要求甲获胜的概率,这个需要列出不同组合【甲-乙 丙-丁】【甲-丙 乙-丁】【甲-丁 乙-丙】,分别求出甲获胜的概率。
例如:
【甲-乙 丙-丁】:
甲-乙:甲获胜概率为 0.1
丙-丁:丙获胜概率为 0.2 丁获胜概率为 0.8
甲-丙:甲获胜概率为 0.3
甲-丁:甲获胜概率为 0.5
此情况,甲获胜概率为(0.10.20.3)+(0.10.80.5)分步乘法及分类加法
同种分析,算出其他两种情况的概率:
【甲-丙 乙-丁】:(0.30.40.1)+(0.30.60.5)
【甲-丁 乙-丙】:(0.50.70.1)+(0.50.30.3)
2.一共需要模拟10万次,此时需要使用种子,选取一个随机数数列,对这三种情况进行随机选择,让每次计算出的甲的概率相加,最后除以10万,即可得到。(随机数是从随机数种子中选取出的数,种子x是一个序号,将序号穿个数列管理器,几个得到对应的随机数列,{A n _n n}=f(x))。
代码实现
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
int main(){double p[3]; //存放三种情况的概率 double sum=0.0;int m;p[0]=0.1*0.2*0.3+0.1*0.8*0.5;p[1]=0.3*0.4*0.1+0.3*0.6*0.5;p[2]=0.5*0.7*0.1+0.5*0.3*0.3;//是以当前时间为种子,产生随意数。//其中,time(NULL)用来获取当前时间//本质上得到的是一个大整数,然后用这个数来取随机数数列。srand(time(NULL));for(int i=0;i<100000;i++){int n=rand()%3;sum+=p[n];}sum=sum/100000;cout<<sum<<endl;
}
不是很清楚,随机数种子使用一次还是使用多次,使用一次的话,在循环外部,就直接得到一个固定的随机数数列,而放到循环内部时,每次都会有一个新的随机数种子,每次都得到一个新的随机数数列。。。
使用一次:0.0759597
多次:0.08 0.046 0.102
这篇关于第三届蓝桥杯--夺冠概率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!