在Java中生成遵循正态分布的数字

6
我希望生成符合给定均值和方差的正态分布随机数。如何做到这一点?
如果您能以Java的上下文来解释就更好了。以下是一些答案供参考,但它们并不精确。 在C/C++中生成符合正态分布的随机数

链接问题的一些答案中实际上有代码,还有一个链接到维基百科页面的实际代码。由于代码可行且易于转换为Java,我不明白哪里“不精确”。 - rici
可能是在C/C++中生成正态分布的随机数的重复问题。 - rici
使用Java内置的nextGaussian()(来自java.util.Random),将其乘以方差的平方根,然后加上均值。 - pjs
1个回答

5

无耻地从http://www.javapractices.com/topic/TopicAction.do?Id=62谷歌并复制而来。

'魔法'发生在Random.nextGaussian()内部。

import java.util.Random;

/** 
 Generate pseudo-random floating point values, with an 
 approximately Gaussian (normal) distribution.

 Many physical measurements have an approximately Gaussian 
 distribution; this provides a way of simulating such values. 
*/
public final class RandomGaussian {

  public static void main(String... aArgs){
    RandomGaussian gaussian = new RandomGaussian();
    double MEAN = 100.0f; 
    double VARIANCE = 5.0f;
    for (int idx = 1; idx <= 10; ++idx){
      log("Generated : " + gaussian.getGaussian(MEAN, VARIANCE));
    }
  }

  private Random fRandom = new Random();

  private double getGaussian(double aMean, double aVariance){
    return aMean + fRandom.nextGaussian() * aVariance;
  }

  private static void log(Object aMsg){
    System.out.println(String.valueOf(aMsg));
  }
} 

谢谢。这应该可以工作。你能告诉我为什么在代码行中使用的是方差乘以随机数,而不是方差乘以根号(方差)吗? - Manoj
1
@Manoj 因为代码片段的作者从未计算过样本方差? - David Eisenstat
我猜这里的方差是指标准差。 - Manoj
@rici,你的描述有两个错误。首先,nextGaussian方法生成的是标准正态分布,而不是均匀分布。其次,标准正态分布应该按照标准差而不是方差进行缩放。 - pjs
@pjs:承认有罪。 - rici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接