Java中的随机正态分布返回范围外的值

时间:2013-02-02 00:07:10

标签: java random normal-distribution

  

可能重复:
  problem with Random.nextGaussian()

我正在开发小型java应用程序以进行随机正态分布并提供50个值。我使用mean = 0.0和std = 1.0,但是我得到的问题是结果超出界限,有些值小于0.0而且大于1.0,有人可以帮助我吗?

以下是我使用的代码:

public static void main(String[] args) {

    double[] list = new double[50];
    double mean = 0.0, std = 1.0;
    Random rng = new Random();

            // to generate 50 values random normal distribution
    for(int i = 0;i<list.length;i++) {
      list[i] = mean + std * rng.nextGaussian();
    }

            // to print the generated values from the list
    for(int i = 0;i<list.length;i++) 
            {
            System.out.println(list[i]); 
    }


}

4 个答案:

答案 0 :(得分:8)

nextGaussian()从该随机数生成器的序列返回下一个伪随机,高斯(“正常”)分布的双值,其平均值为0.0,标准差为1.0。 (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextGaussian()

因此std * rng.nextGaussian();应为std * (1 + rng.nextGaussian())/2;

但是,结果可能不是您想要的高斯,您需要调整a

中不同b(a + rng.nextGaussian())/b的平均值和标准值

答案 1 :(得分:4)

我认为你并没有正确地解释nextGaussian()的含义和目的。如果您想要的数字在[0.0, 1.0)范围内,请改用nextDouble()

nextGaussian()使用平均值和标准差, 不是简单的数字范围 。因此,它具有理论上无限的返回值范围(至少在double的范围内)。详细了解this java doc

中的nextGaussian()

答案 2 :(得分:3)

我认为您将标准偏差与值的范围混淆。它们不是同一件事。

取自Standard Deviation Wikipedia条目:

  

例如,三个群体{0,0,14,14},{0,6,8,14}和{6,6,8,8}中的每一个的平均值为7.他们的标准偏差是分别为7,5和1。

答案 3 :(得分:1)

我理解nextGaussian()的Javadoc说:

  

从该随机数生成器的序列中返回下一个伪随机,高斯(“正常”)分布式双值,其平均值为0.0,标准差为1.0。

它没有说值将从-1到1.然后,如果你希望它在那个值中,你可以丢弃外部值,或者当值在外面时取-1或1。