c++ - 计算概率 C++ 伯努利试验

标签 c++ combinations probability factorial

程序会询问用户掷硬币的次数(n;尝试次数)。

成功被认为是成功的。

程序完美地创建了一个介于 0 和 1 之间的随机数。0 被认为是正面和成功。

然后,程序应该输出获得 x 个正面的期望值。例如,如果硬币被抛掷了 4 次,则使用以下公式的概率是多少

nCk * p^k * (1-p)^(n-k)
Expected 0 heads with n flips: xxx
Expected 1 heads with n flips: xxx
...
Expected n heads with n flips: xxx

当使用“更大”的数字执行此操作时,数字会出现奇怪的值。如果输入 15 或 20,就会发生这种情况。对于应该为 xxx 的值,我得到了 0 和负值。

调试时,我注意到 nCk 已经变为负数并且不正确地朝向上限值并且相信这就是问题所在。我将这个公式用于我的组合:

double combo = fact(n)/fact(r)/fact(n-r);

这是我的事实函数的伪代码:

long fact(int x)
{
     int e; // local counter
     factor = 1;
     for (e = x; e != 0; e--)
     {
         factor = factor * e;
     }
     return factor;
}

有什么想法吗?我的猜测是我的阶乘或组合函数超出了最大值之类的。

最佳答案

您还没有提到 factor 是如何声明的。我认为你正在得到整数溢出。我建议你使用双。这是因为您计算的是预期值和概率,因此您不必太在意精度。

尝试将事实函数更改为。

double fact(double x)
{
     int e; // local counter
     double factor = 1;
     for (e = x; e != 0; e--)
     {
         factor = factor * e;
     }
     return factor;
}

编辑: 同样要计算 nCk,您不需要计算阶乘 3 次。您可以通过以下方式简单地计算该值。

if k > n/2, k = n-k.

       n(n-1)(n-2)...(n-k+1)
nCk = -----------------------
          factorial(k)

关于c++ - 计算概率 C++ 伯努利试验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20164622/

相关文章:

c++ - 创建一个调用另一个可执行文件的可执行文件?

r - 使用条件在 r 中创建组合列表

algorithm - 计算最终市场分布——竞争性编程

matlab - 如何从matlab中精度参数化的多元高斯分布中抽取样本

algorithm - 程序化查询权重

c++ - 模拟数组的随机迭代

c++ - 数据类型匹配,但我的链接列表仍然出错?

c++ - 在 32 位 Windows 上使用 libcurl

sql - 不同于排列的 PostgreSQL 组合

algorithm - 组合问题,房间配置