【发布时间】:2022-01-21 06:20:54
【问题描述】:
我试图从理论上解决一个概率问题,然后在 C++ 上对其进行建模,但我的代码输出的概率与理论概率不同。
问题:
一个平衡的硬币被扔了三遍。计算 3 次投掷中恰好有 2 次出现正面的概率。
答案:
样本空间:{(H,H,H), (H,H,T), (H,T,H), (H,T,T), (T,T,T), (T, T,H), (T,H,T), (T,H,H)}
3 次投掷中恰好有 2 次出现正面的概率 = 3/8
C++ 代码:
#include <iostream>
#include <time.h>
#include <stdlib.h>
bool TossCoinXNumber(int x);
int TossCoin();
void CalcProbability(int x);
using namespace std;
int main()
{
srand (time(NULL));
CalcProbability(1000000);
return 0;
}
int TossCoin(){
int toss = rand() % 2;
return toss;
}
bool TossCoinXNumber(int x){
int heads=0;
int tails = 0;
for(int i = 0; i < x; i++){
if(TossCoin() == 1){
heads++;
}
else if(TossCoin() == 0){
tails++;
}
}
if(heads == 2 && tails == 1){
return true;
}
return false;
}
void CalcProbability(int x){
double probability = 0.0;
double count = 0.0;
for(int i = 0; i < x; i++){
if(TossCoinXNumber(3) == true){
count++;
}
}
probability = (count*1.0) / (x*1.0);
cout << probability;
}
代码输出:0.187053
这与 3/8 的理论概率不同
【问题讨论】:
-
您在每次循环迭代中调用 TossCoin 两次,这些通常会返回不同的结果。
-
旁白:你可能想看看std::binomial_distribution
标签: c++ random probability montecarlo coin-flipping