在Java中从数组生成对数正态分布

时间:2014-02-10 10:28:01

标签: java arrays logging random

我没有找到任何关于这个问题的帮助,所以我发布了一个关于它的新问题。我有一个包含三个值{min,average,standard dev。}的变量。如何生成此数组的对数正态分布,该随机分布将从对数正态分布中随机给出一个时间值。此外,如果我运行1000次,我会想要从1000次的每个对数正态分布中随机获得一个时间值。我怎么用java代码写这个?另外我想运行它1000次会给我平均数组中的平均值吗?

3 个答案:

答案 0 :(得分:4)

首先生成标准正常值,并使用给定参数将它们转换为正态分布。最后提升到指数以获得具有给定均值和标准开发的对数正态分布。

Random rng = new Random(0);
double[] lognormalValues = new double[1000];

for (int i = 0; i < 1000; ++i)
{
    stdNormal   = rng.nextGaussian();
    normalValue = stddev*stdNormal + mean;

    logNormalValues[i] = Math.exp(normalValue);
}

答案 1 :(得分:0)

你也可以在这里获得内置功能。在上面的例子中,你实际上不会最终得到stddev并注明 - 当你exp()值时它们会改变。

http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/distribution/LogNormalDistribution.html

答案 2 :(得分:0)

或者

public static double LogNormal(double mean, double stddev) {
    Random randGen = new Random();
    double varx = Math.pow(stddev, 2);
    double ess = Math.log(1.0 + (varx/Math.pow(mean,2)));
    double mu = Math.log(mean) - (0.5*Math.pow(ess, 2));
    return Math.pow(2.71828, (mu+(ess*randGen.nextGaussian() ) ) );

}