1

可能重复:
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

4 回答 4

9

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

于 2013-02-02T00:13:11.410 回答
3

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

nextGaussian()使用平均值和标准差,而不是简单的数字范围。因此,它理论上具有无限的返回值范围(double至少在范围内)。nextGaussian()这个 java 文档中阅读更多信息

于 2013-02-02T00:12:10.397 回答
2

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

取自标准偏差维基百科条目:

例如,{0, 0, 14, 14}、{0, 6, 8, 14} 和 {6, 6, 8, 8} 三个总体的均值为 7。它们的标准差分别为 7、5 , 和 1, 分别。

于 2013-02-02T00:20:24.370 回答
1

据我了解,Javadoc fornextGaussian()说:

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

它没有说该值将从-1到1。然后,如果您希望它处于该值中,则可以丢弃外部值或在值位于外部时取-1或1。

于 2013-02-02T00:21:10.643 回答