Skip to content

Python: Calculating pi using random numbers

by mat on September 11th, 2009

During my undergraduate degree I wrote a program in fortran 95 to calculate pi using random numbers. My aim is to rewrite it efficiently in python. I know its a terrible way to calculate pi, and there are much better ways to do it but its fun!

First I’ll explain the maths so you can visualise what’s going on. As we should know _pi_ is the ratio of circle’s radius to its circumference, which is conveniently the same as the ratio of a circle’s area to the square of its radius (wiki…)

So what we are going to be doing is picking lots of random coordinates in an x-y grid and calculating if they are within the circle or the square.
python-pi-random-numbers-1
We will assign the radius to be 1, because that makes it easy to work with. By default a random number in python ( random() ) will return a floating point number between 0 and 1. To test if a point is within a circle we simply use Pythagoras.

So if the sqrt(a**2+b**2)<=1 then the point lies inside the circle’s radius. In the diagram above we see that point A lies within the circle, and point B lies outside the circle.

We can really don’t need to use the whole circle as it has symmetry, so we can just take a quartre, which makes the generating of random numbers easier as you only need to use a random number for x and y between 0 and 1, rather than -1 and 1. It will look like the diagram below.

python-pi-random-numbers-2

Now for a confusing bit of maths. We are calculating the ratio of the area of a circle to the area of a square.

# Area of circle
A=pi*r**2
# where r = 1
A = pi
# Area of square
A = l ** 2
# in this case (see diagram) our square's length is twice the radius
l=2*r
A=(1+1)**2 = 4

#Therefore our ratio will be pi : 4.
# Which means we must multiply our result by four to get pi.

Final version (efficient for using)

from random import *
from math import sqrt
inside=0
n=1000
for i in range(0,n):
	x=random()
	y=random()
	if sqrt(x*x+y*y)<=1:
		inside+=1
pi=4*inside/n
print pi

Below we can see the values it creates

n	calc	error
1	4.00000000	0.73686317
10	3.60000000	0.45840735
100	3.24000000	0.09840735
1000	3.06400000	-0.07759265
10000	3.16160000	0.02000735
100000	3.14140000	-0.00019265
1000000	3.14293600	0.00134335
10000000	3.14117920	-0.00041345

pi-random-number-error

So we can see that the program quickly solves pi to about two decimal places, but it is a terribly inefficient method and will struggle to get much more accuracy than this.

Resources to check out:
This blog post – Solves pi via taylor series expansion
Super pi – Program that calculate pi often used for benchmarking

6 Comments
  1. Very nice. The technique used here is called “Monte-Carlo Integration” http://en.wikipedia.org/wiki/Monte_Carlo_integration. I used this technique (using C++) in my undergrad as well; to estimate the total volume of randomly generated spheres–3 dimensions as opposed to 2 here. Check it out in my portfolio http://www.matthewboston.com/portfolio/ under C++.

  2. Eamon Gaffney permalink

    fyi, pi is the ratio of circumference to diameter, not radius

  3. Рајко Велимировић permalink

    I found a new formula for the number of PI = 3.141 ..
    Pi = n / 2 (sin (360 / n))
    sin in degrees
    n {3,4,5,6,7 …………………. infinitely}
    n = 3 it is a triangle, n = infinity this is a circle

    Рајко Велимировић
    Србија

  4. Bobby permalink

    can you please add the code for how you generate the graph and error terms please. i need it for something similar thanks!

  5. @Bobby The code for the terms generated is listed, the graph is just a box-standard open-office graph and the errors are not scientific they are just how far away from pi the approximation is.

  6. Bobby permalink

    Sure. I thought you plotted it in python. along with the error table

Leave a Reply

Note: I am currently writing my thesis so probably wont have time to reply to your comment
Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS