Zhao70's Blog

C++产生随机数

前(tu)言(cao)

在做蓝桥2012预赛试题的时候, 做到“夺冠概率”这道题, 明明可以用数学上的方法求解。 结果,必须使用随机数,因为三次运行程序结果相同不给分。。。

题目

足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。
假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
       甲 乙 丙 丁
甲 - 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,…
现在要举行一次锦标赛。双方抽签,分两个组比,获胜的两个队再争夺冠军。(参见【1.jpg】)
请你进行10万次模拟,计算出甲队夺冠的概率。

"图一"

评测标准

满分17分

编译选手提供的源代码,运行看结果

!! 至少运行3次,如果结果相同则不能得分! 说明选手是用理论推算而非模拟方法。

输出四舍五入后为: 0.075 或 0.076 即可满分17分

如果输出 7.5 或 7.6 是采用了百分数的形式,也认为正确。

多次运行结果为:0.074 或 0.077 表明存在设计上的系统误差,可以给 5 分

如何产生随机数

  1. 添加头文件stdlib.h
  2. 由于rand()返回的是伪随机数字, 每次执行时结果是相同的
  3. 为了避免每次生成固定的随机数,引进srand()函数

    用法:srand(unsigned int seed)

  4. 可以利用中的随机函数初始化, 产生不同的随机种子

  5. srand((unsigned)time(NULL))

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
int main()
{
double arr[3] = {0.046, 0.102, 0.08};
double sum = 0;
//这里srand只能写在for循环外侧,否则会WA
//看来srand的seed整个程序运行时只执行一次即可
srand(time(NULL));
for(int i = 0; i <= 100000 ; i++)
{
int val = rand() % 3;
sum = sum + arr[val];
}
cout << sum / 100000;
return 0;
}