我试图计算' n'的累积二项概率。试验,以及' p'概率和' r'作为每个试验的成功结果。我编写了以下有时有效的代码,但并非总是如此:
Console.WriteLine ();
Console.WriteLine ("B~(n, p)");
incorrectN:
Console.WriteLine ("Enter value of 'n': ");
int n = Convert.ToInt32 (Console.ReadLine ());
if (n < 0) {
Console.WriteLine ("ERROR: 'n' must be greater than 0");
goto incorrectN;
}
incorrectP:
Console.WriteLine ();
Console.WriteLine ("Enter value of 'p': ");
double p = Convert.ToDouble (Console.ReadLine ());
if (p > 1) {
Console.WriteLine ();
Console.WriteLine ("ERROR: 'p' must be between 0 and 1");
goto incorrectP;
}
Console.WriteLine ();
incorrectS:
int r = GetR();
int k = r;
double binomTotal = 0;
for (int j = r + 1; j > 0; j--) {
int nCr = Factorial(n) / (Factorial(n - (r - k)) * Factorial(r - k));
binomTotal = binomTotal + nCr * Math.Pow(p, (r - k)) * Math.Pow(1 - p, (n - (r - k)));
k--;
}
Console.WriteLine();
Console.WriteLine(binomTotal);
P.S。我在课程的其他地方写了GetR()
和Factorial()
个函数,其中GetR()
会询问用户&#39; r&#39; Factorial()
的定义如下:
public static int Factorial(int x)
{
return x <= 1 ? 1 : x * Factorial(x - 1);
}
我使用值n = 10, p = 0.5
和r = 5
测试了代码,输出为0.623046875
,这是正确的。但是,当我使用n = 13, p = 0.35
和r = 7
时,我会0.297403640622647
而不是0.9538
。
非常感谢任何帮助。
答案 0 :(得分:2)
除了你自己的答案:
public static double Factorial(double x)
{
return x <= 1 ? 1 : x * Factorial(x - 1);
}
接受double
参数,这意味着x
不限于整数。
因此,您可以像这样调用Factorial
方法。
var fac1 = Factorial(1.4);
var fac2 = Factorial(2.7);
然而,这没有意义,因为因子仅为定义*,这意味着 未定义。
因此,您应该使用long
而不是使用double
并允许无效输入,而的范围大于int
。
public static long Factorial(long x)
{
return x <= 1 ? 1 : x * Factorial(x - 1);
}
*在某些情况下,阶乘也可以与实际值一起使用 - 例如使用gamma函数 - 但我不认为它们与您的用例相关,因此您不应该允许无效参数。
答案 1 :(得分:1)
变化:
public static int Factorial(int x)
{
return x <= 1 ? 1 : x * Factorial(x - 1);
}
要:
public static double Factorial(double x)
{
return x <= 1 ? 1 : x * Factorial(x - 1);
}
因为Factorial(13)
对于Int32来说太大了。