正态分布计算有重复的答案且不正确

时间:2018-09-16 19:24:39

标签: c math statistics

我正在编写一个程序,计算在此给我的正态分布函数的值:

Normal Distribution Equation

该程序应该向用户询问上面显示的正态分布的均值μ和标准偏差σ。然后,程序要求 N x 值,然后一个一个地要求每个 x 值。在每个值 x 之后,它将写出函数的相应值。

到目前为止,这是我的代码:

#define _USE_MATH_DEFINES
#include <stdio.h>
#include <math.h>

int main() {

int j;
double u, stddev, N, result, x;

printf("Enter u and stddev for the Normal Distribution:\n");
  scanf("%lf %lf",&u, &stddev);
printf("Enter how many values of x (N) for the Normal Distribution:\n");
  scanf("%lf",&N);

for (j=0; j<N; j++) {

printf("Enter a value for x: \n");
  scanf("%lf",&x);
result = ((1)/(stddev*sqrt(2*M_PI)))*exp(-(1/2)*((x-u)/stddev)*((x-u)/stddev));
printf("%.6lf\n", result);

 }
}

我基本完成了,但是与我的计算器给出的答案相比,程序给出的答案是错误的。例如,当我使 N = 3时,无论我为 x 的3个值加上什么,当它们不应该设置为3时,它给我的答案都是相同的是。

所以我知道我的问题出在这行代码中:

result = ((1)/(stddev*sqrt(2*M_PI)))*exp(-(1/2)*((x-u)/stddev)*((x-u)/stddev));

我只是在程序中编写了错误的函数吗?我一定是,因为它不起作用。

1 个答案:

答案 0 :(得分:1)

您的代码干净且功能正常。到目前为止工作很好。

关于哪一行需要更改,您是正确的-问题是使用整数除法会得出整数,因此1 / 2会得出0的值。可以通过使用单个双精度值0.5或使用双精度1.0 / 2.0来解决。

result = ((1)/(stddev*sqrt(2*M_PI)))*exp(-(0.5)*((x-u)/stddev)*((x-u)/stddev));

在进行了try it online的这些更改之后,我测试了您的代码,它们与wolfram alpha上的公式以及您在注释中所说的完全匹配。

例如:

μ=2, σ=3, x=7 results in 0.033159
μ=3, σ=7, x=0 results in 0.051991
μ=4, σ=4, x=4 results in 0.099736