/*************************************************************************
* Author: Kevin Wayne
* Date: 8/20/04
* Compilation: javac StdGaussian.java
* Execution: java StdGaussian
*
* Computes a standard Gaussian random deviate using the cartesian
* form of the Box-Muller transform. The method is to compute a
* random point (x, y) inside the circle centered at (0, 0) with
* radius 1. Then
*
* x * Math.sqrt(-2.0 * Math.log(r) / r)
*
* and
*
* y * Math.sqrt(-2.0 * Math.log(r) / r)
*
* are each Gaussian random variables with mean 0 and standard deviation 1.
* This formula appears in
*
* Knuth, The Art of Computer Programming, Volume 2, p. 122.
*
*
* Sample executions
* ---------------------
* % java StdGaussian
* -1.2927277357189828
*
* % java StdGaussian
* 0.32433796089430544
*
* % java StdGaussian
* -0.1174251833833895
*
* % java StdGaussian
* 0.053192581194524566
*
*************************************************************************/
public class StdGaussian {
public static void main(String[] args) {
double r, x, y;
// find a uniform random point (x, y) inside unit circle
do {
x = 2.0 * Math.random() - 1.0;
y = 2.0 * Math.random() - 1.0;
r = x*x + y*y;
} while (r > 1 || r == 0); // loop executed 4 / pi = 1.273.. times on average
// http://en.wikipedia.org/wiki/Box-Muller_transform
// apply the Box-Muller formula to get standard Gaussian z
double z = x * Math.sqrt(-2.0 * Math.log(r) / r);
// print it to standard output
System.out.println(z);
}
}
Last updated: Thu Sep 2 10:52:39 EDT 2004
.
Copyright © 2004, Robert Sedgewick and Kevin Wayne.