/************************************************************************* * Compilation: javac StdRandom.java * Execution: java StdRandom * *************************************************************************/ public class StdRandom { // return a real number uniformly between a and b public static double uniform(double a, double b) { return a + Math.random() * (b-a); } // return an integer uniformly between 0 and N-1 public static int uniform(int N) { return (int) (Math.random() * N); } // return a boolean, which is true with prob p and false otherwise public static boolean bernoulli(double p) { return Math.random() < p; } // return a real number with a standard Gausian distribution public static double gaussian() { double r, x, y; do { x = uniform(-1.0, 1.0); y = uniform(-1.0, 1.0); r = x*x + y*y; } while (r >= 1 || r == 0); return x * Math.sqrt(-2 * Math.log(r) / r); // Remark: y * Math.sqrt(-2 * Math.log(r) / r) // is an independent random gaussian } // return a real number from a gaussian distribution with given mean and stddev public static double gaussian(double mean, double stddev) { return mean + stddev * gaussian(); } // return i with probability a[i] // precondition: sum of array entries equals 1 public static int discrete(double[] a) { double r = Math.random(); double sum = 0.0; for (int i = 0; i < a.length; i++) { sum = sum + a[i]; if (sum >= r) return i; } assert(false); return -1; } // exponential random variable with rate lambda public static double exp(double lambda) { return -Math.log(1 - Math.random()) / lambda; } // swaps array elements i and j public static void exch(String[] a, int i, int j) { String swap = a[i]; a[i] = a[j]; a[j] = swap; } // take as input an array of strings and rearrange them in random order public static void shuffle(String[] a) { int N = a.length; for (int i = 0; i < N; i++) { int r = i + uniform(N-i); // between i and N-1 String temp = a[i]; a[i] = a[r]; a[r] = temp; } } }