累积二项概率C#

时间:2015-02-16 13:02:51

标签: c# math

我试图计算' 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.5r = 5测试了代码,输出为0.623046875,这是正确的。但是,当我使用n = 13, p = 0.35r = 7时,我会0.297403640622647而不是0.9538

非常感谢任何帮助。

2 个答案:

答案 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);

然而,这没有意义,因为因子n!仅为n定义*,这意味着 1.7!未定义。

因此,您应该使用long而不是使用double并允许无效输入,而Here is a picture from the event in the editor的范围大于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来说太大了。