对于正常的标准分布,我需要填充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;
}
}
}
答案 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开始)。