在模块中添加概率方程

时间:2015-10-30 01:16:01

标签: c++

我一直致力于这个程序,它应根据以下公式计算概率:

()=(!)/(!)*( - )!)*(p ^ x)*((1-p)^(N-x))

此外,当用户输入一个值时,N必须是一个整数,x必须是一个介于0和N之间的整数,而p必须是介于0和1之间的正实数。到目前为止这个部分是有效的很好,但我不知道如何在程序中正确添加概率公式。

以下是我目前的代码:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;


long int factorial (int N, int x, int p);


int main ()
{
double N, x, p;


cout << "Input N value" << endl;
cin >> N;

cout << "Input x Value" << endl;
cin >> x;
while(x<=0 || x>=N){
    cout << "x value is NOT between 0 and N." << endl;
    cout << "Input x Value" << endl;
    cin >> x;

}
cout << "Input p value" << endl;
cin >> p;
while(p<=0 || p>=1){
    cout << "p value is NOT a real number between 0 and 1." << endl;
    cout << "Input p value" << endl;
    cin >> p;
}
return 0;

}

任何人都可以帮助我了解如何在我的程序中正确添加等式吗?

谢谢!

这是我的新代码:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;


double factorial (double N, double x, double p);


int main ()
{
double N;
double x;
double p;

cout << "Input N value" << endl;
cin >> N;

cout << "Input x Value" << endl;
cin >> x;
while(x<=0 || x>=N){
    cout << "x value is NOT between 0 and N." << endl;
    cout << "Input x Value" << endl;
    cin >> x;

}
cout << "Input p value" << endl;
cin >> p;
while(p<=0 || p>=1){
    cout << "p value is NOT a real number between 0 and 1." << endl;
    cout << "Input p value" << endl;
    cin >> p;
}
double Probability;
Probability = factorial(N, x, p);

cout << "Probability= " << Probability << endl;
return 0;
}

double factorial (double N, double x, double p){


double answer = ((tgamma(N+1))/((tgamma(x+1)) * (tgamma((N-x)+1)))) * (pow(p,x)) * (pow((1-p),(N-x)));
return answer;
}

程序会识别我在系统中输入的值,但是当它计算出答案时,它会给出一个非常小的数字。我尝试了公式的每个部分,以确保它们不是一个错误,但当我独立测试时一切正常。有谁知道这个等式有什么问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先你需要编写一个阶乘函数,看看这个stackoverflow链接: How do you implement the factorial function in C++?

然后只需编写一个函数进行计算。假设你的阶乘函数被称为getFact(int n),那么:

double solve(int N, int x, double p) {

    double answer = ( getFact(N)/getFact(x) )*getFact((N-x))* pow(p,x)* pow((1-p),(N-x));
    return answer;
}

然后在设置值后调用main中的solve函数。

double P_x;
P_x = solve(N,x,p);

另外,我使用双精度因为它们可以更准确,特别是对于p,因为它是0 <= p <= 1。