01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package algs15.perc;
import stdlib.*;

public class PercolationStats {
  double[] results;

  // perform T independent computational experiments on an N-by-N grid
  public PercolationStats(int N, int T) {
    if (N<=0 || T<=0) throw new IllegalArgumentException();
    this.results = new double[T];

    for (int t=0; t<T; t++) {
      int opened = 0;
      Percolation perc = new Percolation(N);
      long numTries = 0;
      long maxTries = (long) Math.pow(N, 3); // N*N*N does int multiplication
      while (!perc.percolates() && numTries<maxTries) {
        int i = StdRandom.uniform(N);
        int j = StdRandom.uniform(N);
        if (!perc.isOpen(i, j)) {
          opened ++;
          perc.open(i, j);
        }
        numTries++;
      }
      results[t] = opened / (double) (N*N);
    }
  }
  // sample mean of percolation threshold
  public double mean() {
    return StdStats.mean (results);
  }
  // sample standard deviation of percolation threshold
  public double stddev() {
    return StdStats.stddev (results);
  }
  // low end of 95% confidence interval
  public double confidenceLow() {
    return StdStats.mean(results)
        - ((1.96 * StdStats.stddev(results))
            / Math.sqrt(results.length));
  }
  // high end of 95% confidence interval
  public double confidenceHigh() {
    return StdStats.mean(results)
        + ((1.96 * StdStats.stddev(results))
            / Math.sqrt(results.length));
  }

  public static void main(String[] args) {
    final int MIN = 16;
    final int MAX = 200000;
    final int T = 10;
    double time = 0;
    double prev = 0;
    for (int NSquare=MIN; NSquare<=MAX; NSquare+=NSquare) {
      int N = (int) Math.floor (Math.sqrt (NSquare));
      Stopwatch timer = new Stopwatch();
      PercolationStats stats = new PercolationStats(N,T);
      time = timer.elapsedTime ();
      StdOut.format ("T=%d N=%,5d N^2=%,10d mean=%5.3f confidence=[%5.3f,%5.3f] time=%6.2f ratio=%3.2f\n",
          T, N, N*N, stats.mean(), stats.confidenceLow(), stats.confidenceHigh(), time, time/prev);
      prev = time;
    }
  }
}