C中正态分布的错误答案

时间:2013-11-24 00:30:44

标签: c matlab

我使用此链接中给出的等式应用了正态分布函数: http://en.wikipedia.org/wiki/Normal_distribution

我为正态分发制作了此代码

float m=2.0;
float s=0.5;
float x[3]={1.0, 2.0, 3.0};
float xs[3];
const float pi = 3.141;

for (int i=0; i<3; i++)
{
    xs[i]=(1/s*sqrt(2*pi))*exp(-(pow(x[i]-m,2)/2*pow(s,2)));
    printf("\n%f",xs[i]);
}

此代码的答案是4.42,5.01,4.42

我在Matlab中有相同的代码

x_s_new=[1 2 3];
x_s=2+0.5.*randn(1,9);
x_s=x_s_new+0.5.*randn(1,3);
plot(x_s_new)

但是matlab中的答案是0.8,1.9,3.7

谁能告诉我哪里出错了?

我想使用C

应用正态分布

谢谢:)

1 个答案:

答案 0 :(得分:1)

您的Matlab代码不是C代码的类似代码。 C代码计算某些点处正态分布的概率密度函数的值。 Matlab代码从正态分布中生成随机数。

与C代码对应的Matlab代码是

m = 2;
s = 0.5;
x = [1 2 3];

for i = 1 : 3
    xs(i) = (1/s*sqrt(2*pi)) * exp(-( (x(i)-m)^2/2*s^2));
    fprintf('%f\n',xs(i));
end

并给出相同的结果

4.424183
5.013257
4.424183

但是,有一个错误,因为Matlab和C中的/仅适用于紧邻的下一个操作数。正确的是

xs(i) = 1/(s*sqrt(2*pi)) * exp(-( (x(i)-m)^2/(2*s^2)));

并相应地在C。

要使用randn将代码转换为C - 据我所知,C中没有标准函数来生成正态分布的随机数,您需要找到包含此类函数的库,或者自己构建它来自random()