【发布时间】:2013-11-24 00:29:13
【问题描述】:
程序询问用户掷硬币的次数(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;
}
有什么想法吗?我的猜测是我的阶乘或组合函数超过了最大值或其他东西。
【问题讨论】:
-
您可能会遇到整数溢出。尝试将事实函数的类型更改为 double,看看是否接受了更高的值。
-
这里:stackoverflow.com/a/4701106/576911 是如何计算
nCk时溢出的风险最小,如果确实发生了溢出,它不会默默地这样做。
标签: c++ combinations probability factorial