/* * TransformedLFSR.java * Created on Feb 22, 2005 */ package random; /** * Transforms a uniform random number generator according to * y1 = sqrt(-2 ln(x1)) sin(x2) * y2 = sqrt(-2 ln(x1)) cos(x2) */ public final class TransformedLFSR { private LFSR rng = new LFSR(); private boolean haveY2 = false; private double y2; public double next() { double nextNum; if (haveY2) { nextNum = y2; haveY2 = false; } else { double x1 = rng.nextDouble(); // can't take the log of zero if (Double.compare(x1, 0.0) == 0) return next(); double x2 = rng.nextDouble(); double k = Math.sqrt(-2 * Math.log(x1)); nextNum = k * Math.sin(x2); this.y2 = k * Math.cos(x2); haveY2 = true; } return nextNum; } // // some stuff to numerically evaluate cumulants // public static void main(String args[]) { final int NUM_ITERS = 5000000; TransformedLFSR rng = new TransformedLFSR(); double raw1Sum = 0, raw2Sum = 0, raw3Sum = 0; for (int i = 0; i < NUM_ITERS; i++) { double p = rng.next(); raw1Sum += p; raw2Sum += p * p; raw3Sum += p * p * p; } double raw1 = raw1Sum / NUM_ITERS; double raw2 = raw2Sum / NUM_ITERS; double raw3 = raw3Sum / NUM_ITERS; double C1 = raw1; double C2 = raw2 - (raw1 * raw1); double C3 = raw3 - (3 * raw1 * raw2) + (2 * raw1 * raw1 * raw1); System.out.println("C1: " + C1); System.out.println("C2: " + C2); System.out.println("C3: " + C3); } }