title: Monte Carlo calculation of pi using randomly generated data in Java
body: <p>I'm working on a program that calculates <code>pi</code> based on randomly generated float numbers that represent x,y co-ordinates on a graph. Each x, y co-ordinate is raised by the power of 2 and stored in two separate arrays. The co-ordinates are distributed uniformly on a graph of interval of 0,1.</p>
  
  <p>The program adds the x, y co-ordinates and if they are less than 1 then the points are located within a circle of diameter 1, illustrated in the diagram below.</p>
  
  <p><a href="https://i.stack.imgur.com/c9Qhr.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/c9Qhr.png" alt="enter image description here"></a></p>
  
  <p>I then used the formula,</p>
  
  <p>π ≈ 4 <em>w</em> / <em>n</em> </p>
  
  <p>to work out pi. Where, <em>w</em> is the count of the points within the circle and <em>n</em> is the number of x or y co-ordinates within the arrays.</p>
  
  <p>When I set n up to 10,000,000 (the size of the array) it generates the most accurate calculation of pi of 15-16 decimal places. However after dedicating 4GB of RAM to the run config and setting n to 100,000,000 pi ends up being 0.6710... </p>
  
  <p>I was wondering why this may be happening? Sorry if this is a stupid question.. code is below.</p>
  
  <pre><code>import java.text.DecimalFormat;
  import java.util.Random;
  
  public class random_pi {
  
      public random_pi() {
  
          float x2_store[] = new float[10000000];
          float y2_store[] = new float[10000000];
          float w = 0;
  
          Random rand = new Random();
          DecimalFormat df2 = new DecimalFormat("#,###,###");
  
          for (int i = 0; i &lt; x2_store.length; i++) {
              float x2 = (float) Math.pow(rand.nextFloat(), 2);
              x2_store[i] = x2;
              float y2 = (float) Math.pow(rand.nextFloat(), 2);
              y2_store[i] = y2;
          }
  
          for (int i = 0; i &lt; x2_store.length; i++) {
              if (x2_store[i] + y2_store[i] &lt; 1) {
                  w++;
              }
          }
  
          System.out.println("w: "+w);
          float numerator = (4*w);
          System.out.printf("4*w: " + (numerator));
          System.out.println("\nn: " + df2.format(x2_store.length));
          float pi = numerator / x2_store.length;
  
          String fmt = String.format("%.20f", pi);
          System.out.println(fmt);
  
          String pi_string = Double.toString(Math.abs(pi));
          int intP = pi_string.indexOf('.');
          int decP = pi_string.length() - intP - 1;
          System.out.println("decimal places: " + decP);
      }
  
      public static void main(String[] args) {
          new random_pi();
      }
  }
  </code></pre>