带阵列的标准正态分布

时间:2013-12-17 19:27:13

标签: java arrays loops math logic

对于正常的标准分布,我需要填充x值为-2.0到2.0的数组。我在数学逻辑上遇到麻烦,让它填满阵列。我把方程式分为两部分。我当前的算法是在for循环中实例化一个数组,有20个循环,每个循环在等式中从-2.0开始运行当前值。然后将最终值添加到第二个数组中并重新运行循环。

import java.lang.Math;
public class Distribution {

    public static void main (String[] args)
    {

        double mean, omega, pi, e, distribution1, distribution2 , x, y;


        mean = 0.0;
        omega = 1.0;
        pi = 3.14159;
        e = 2.71828;

        double[] xarray;

        for (int i = 0; i < 20, i++)
        {   
            xarray[1] = -2.0;
        distribution1 = -((xarray[2.0]-mean)*(xarray[2.0]-mean))/(2.0*omega);

        distribution2[20] = 1.0 /((sqrt(2*pi)))*e*distribution1;

        xarray[1] = xarray[1] + 0.2;

        }


}

}

1 个答案:

答案 0 :(得分:1)

编辑:我现在意识到你只想用连续的standard normal distribution值填充数组(而不是从正态分布中采样)。这更简单:

final double C = 1 / Math.sqrt(2 * Math.PI);

final double start = -2.0;
final double end = 2.0;

double[] xarray = new double[20];  // <--    

for (int i = 0; i < xarray.length; i++) {

    double x = start + i * (end - start)/xarray.length;

    xarray[i] = C * Math.exp(-0.5 * x * x);
}

上述说明仍然适用。另请注意,标准正态分布没有任何参数(即均值和方差),而通用normal distribution则没有。概括上面的代码非常简单。


(原帖)

我改为使用Box-Muller transform(将均匀分布的变量映射到正态分布的变量)。它很容易实现:

double[] xarray = new double[20];  // <--

for (int i = 0; i < xarray.length; i++) {

    double u1 = Math.random();
    double u2 = Math.random();

    double r = Math.sqrt(-2 * Math.log(u1));

    xarray[i] = r * Math.cos(2 * Math.PI * u2);
}

很少有事情需要注意:

  • 我们需要初始化数组:new double[20]
  • 我们使用xarray[i]来引用数组中的i元素(从0开始)。