当前位置:   article > 正文

c++随机数_c++算法训练随机数(蓝桥杯)--足球比赛

蓝桥杯一到十万中选一个随机数

db60ef3a2d6a1bc514d8781e415c7ef0.png

大家好,我是名侦探茹小依,今天我们用一道蓝桥杯的竞赛题来讲讲如何使用随机数来模拟概率的情况。首先来说一下预备知识,随机数的使用:

C++使用随机数要用到包含头文件 #include <ctime>,这种随机数是根据时间变化产生的一种伪随机数。使用时:

1. 包含头文件#include <ctime>

2. 定义随机化种子:srand(time(NULL))

3. 用rand()就可以可得到0 ~ 32757范围的随机数

4. 用下列公式即可得到指定范围[m,n]的随机数:r = rand()%(n - m + 1) + m;

5. 注意:n - m 的绝对值不能超过32767

首先来看题目:

足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。

假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:

- 0.1 0.3 0.5

乙 0.9 - 0.7 0.4

丙 0.7 0.3 - 0.2

丁 0.5 0.6 0.8 -

数据含义:甲对乙的取胜概率为0.1,丙对乙的胜率为0.3,...

现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。

请你进行10万次模拟,计算出甲队夺冠的概率。

可以看到进行10万次模拟,就是让我们使用随机数的一个提示,程序实现所有可能后,进行10万次模拟,满足条件的记为一次,最后用满足条件的除以模拟总次数,就是甲获胜的频率。

而实验次数一多,概率也就成了频率。

至于如何实现,让我们看如下程序(基于循环的熟练使用):

#include <iostream>

#include <ctime>

using namespace std;

int main()

{

srand(time(NULL));

int a,b,c,d,n=0;

double m;

int t=100000;

int game[4][4]={0,1,3,5,9,0,7,4,7,3,0,2,5,6,8,0};//将概率扩大10倍

for(int i=1;i<=t;i++)

{

a=rand()%10;//随机产生0~9一个数当做比赛概率

b=rand()%3+1;//随机产生0~3一个数当做与乙、丙、丁三人随机比赛

if(a>=game[0][b])//甲输了

continue;//跳出本次循环开始下一次

else

{

if(b==1)//甲赢了乙

{

c=rand()%10;

if(c>=2)//丙胜

b=2;

else//丁胜

b=3;

}

if(b==2)//甲赢了丙

{

c=rand()%10;

if(c>=4)//丁胜

b=3;

else//乙胜

b=1;

}

if(b==3)//甲赢了丁

{

c=rand()%10;

if(c>=7)//丙胜

b=2;

else//乙胜

b=1;

}

d=rand()%10;

if(d>=game[0][b])//甲输了,结束本次循环

continue;

else

n++;//最终甲取胜,记数一次。

}

}

m=double(n)/t;//注意计算时,强制数据类型转换

cout<<"甲获胜的次数为:"<<endl<<n<<endl<<"甲获胜的概率为:"<<endl<<m*100<<"%"<<endl;

return 0;

}

多运行几次,由于是随机数,小数点后几位会有些不同,属于正常现象

7bbb37b95a8001ec3da621265c8c287a.png

49f806ca4ab2071af9d577895a0834a1.png

c66185e9156aea994b3fbfaaf0b7acdd.png

注释尽量详细了,有什么不懂得在评论区来问吧!

码字不易,给小依酱的文章一个赞,给小依酱的专栏一个关注吧⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/463095
推荐阅读
相关标签
  

闽ICP备14008679号