足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能。
假设有甲、乙、丙、丁四个球队。根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表:
甲 乙 丙 丁
甲 - 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万次模拟,计算出甲队夺冠的概率。
/*
计算甲队获胜的概率:
记 甲乙丙丁分别为 a,b,c,d;
甲 乙 丙 丁
甲 0.1 0.3 0.5
乙0.9 0.7 0.4
丙0.7 0.3 0.2
丁0.5 0.6 0.8
用一个100000的循环计算有利事件个数;
分6种情况讨论A获胜的事件数;
其中调用随机函数来筛选出事件个数,这个技巧很关键。
*/
# include <stdio.h>
# include <stdlib.h>
int main(){
int i, j, k; //count
int randfigure;
int awin = 0;
for(i = 0; i < 100000; i++){
randfigure = rand(); //调用产生伪随机数的随机函数
if(randfigure % 3 == 0){ //AB together
if(randfigure % 10 < 1){ //A win B
if(randfigure % 10 < 2){ //C win D
if(randfigure % 10 < 3){ //A win C
awin++;
}
}else{ //D win C
if(randfigure % 10 < 5){ //A win D
awin++;
}
}
}
}else if(randfigure % 3 == 1){ //AC together
if(randfigure % 10 < 3){ //A win C
if(randfigure % 10 < 4){ //B win D
if(randfigure % 10 < 1){ //A win B
awin++;
}
}else{ //D win B
if(randfigure % 10 < 5){ //A win D
awin++;
}
}
}
}else{ //AD together
if(randfigure % 10 < 5){ //A win D
if(randfigure % 10 < 3){ //C win B
if(randfigure % 10 < 3){ //A win C
awin++;
}
}else{ //B win C
if(randfigure % 10 < 1){ //A win B
awin++;
}
}
}
}
}
printf("%f\n", awin / 100000.0);
return 0;
}
这个调用随机函数很精髓。