我正在开发小型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]);
}
}
答案 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。