【问题标题】:Question About a Probability Model Using C++关于使用 C++ 的概率模型的问题
【发布时间】: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


【解决方案1】:

正如n. 1.8e9-where's-my-share m. 正确指出的那样,您正在调用TossCoin() 两次。这是修复问题的修改代码:

#include <stdlib.h>
#include <time.h>

#include <iostream>

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++)
    {
        int toss = TossCoin();
        if (toss == 1)
        {
            heads++;
        }
        else if (toss == 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;
}

这是我更喜欢的较短的代码:

#include <iostream>
#include <random>

 using namespace std;

 int main(void)
{
     int tries = 1000000, count = 0;

    for (int i = 0; i < tries; ++i)
    {
        int heads = 0;
        for (int j = 0; j < 3; ++j) heads += (rand() % 2);
        count += (heads == 2);
    }

    cout << count / float(tries) << endl;
}

在此代码中,比较的整数结果用于递增heads, count,因此我们没有任何ifs。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 2011-06-30
    • 2020-02-11
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多