1 public class PercolationStats { 2 3 private int N; 4 private int T; 5 private double[] results; 6 7 public PercolationStats(int N, int T) { 8 if (N <= 0 || T <= 0) { 9 throw new java.lang.IllegalArgumentException( 10 "N or T must be greater than 0"); 11 } 12 13 this.N = N; 14 this.T = T; 15 results = new double[T]; 16 17 for (int t = 0; t < T; t++) { 18 results[t] = run(); 19 } 20 } 21 22 private double run() { 23 Percolation percolation = new Percolation(N); 24 double count = 0; 25 26 while (!percolation.percolates()) { 27 count++; 28 29 // pick a random site 30 // (N+1 because second value to uniform is exclusive) 31 int i = StdRandom.uniform(1, N + 1); 32 int j = StdRandom.uniform(1, N + 1); 33 34 // generate new random sites until a blocked one is found 35 while (percolation.isOpen(i, j)) { 36 37 i = StdRandom.uniform(1, N + 1); 38 j = StdRandom.uniform(1, N + 1); 39 40 } 41 42 // open that site 43 percolation.open(i, j); 44 45 } 46 return count / (N * N); // percolation threshold estimate 47 } 48 49 public double mean() { 50 return StdStats.mean(results); 51 } 52 53 public double stddev() { 54 return StdStats.stddev(results); 55 } 56 57 public double confidenceHi() { 58 return mean() - 1.96 * stddev() / Math.sqrt(T); 59 } 60 61 public double confidenceLo() { 62 return mean() + 1.96 * stddev() / Math.sqrt(T); 63 } 64 65 public static void main(String[] args) { 66 67 int N; 68 int T; 69 70 if (args.length == 0) { 71 N = 100; 72 T = 10; 73 } else { 74 N = Integer.parseInt(args[0]); 75 T = Integer.parseInt(args[1]); 76 } 77 78 // double startTime = System.nanoTime(); 79 PercolationStats stats = new PercolationStats(N, T); 80 81 double confidenceLow = stats.confidenceHi(); 82 double confidenceHigh = stats.confidenceLo(); 83 84 System.out.println("mean = " + stats.mean()); 85 System.out.println("stddev = " + stats.stddev()); 86 System.out.println("95% confidence interval = " + confidenceLow + ", " 87 + confidenceHigh); 88 89 // performance measuring 90 // double endTime = System.nanoTime(); 91 // System.out.println("time cost: " + (endTime - startTime)); 92 93 } 94 }