程序会询问用户掷硬币的次数(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/