[Math] Will this procedure generate random points uniformly distributed within a given circle? Proof

algorithmsprobability theory

Consider the task of generating random points uniformly distributed within a circle of a given radius $r$ that is centered at the origin. Assume that we are given a random number generator $R$ that generates a floating point number uniformly distributed in the range $[0, 1)$.

Consider the following procedure:

  1. Generate a random point $p = (x, y)$ within a square of side $2r$ centered at the origin. This can be easily achieved by:

    a. Using the random number generator $R$ to generate two random numbers $x$ and $y$, where $x, y \in [0, 1)$, and then transforming $x$ and $y$ to the range $[0, r)$ (by multiplying each by $r$).

    b. Flipping a fair coin to decide whether to reflect $p$ around the $x$-axis.

    c. Flipping another fair coin to decide whether to reflect $p$ around the $y$-axis.

  2. Now, if $p$ happens to fall outside the given circle, discard $p$ and generate another point. Repeat the procedure until $p$ falls within the circle.

Is the previous procedure correct? That is, are the random points generated by it uniformly distributed within the given circle? How can one formally [dis]prove it?


Background Info

The task was actually given in Ruby Quiz – Random Points within a Circle (#234). If you're interested, you can check my solution in which I've implemented the procedure described above. I would like to know whether the procedure is mathematically correct or not, but I couldn't figure out how to formally [dis]prove it.

Note that the actual task was to generate random points uniformly distributed within a circle of a given radius and position, but I intentionally left that out in the question because the generated points can be easily translated to their correct positions relative to the given center.

Best Answer

Yes this will work; it's called rejection sampling.

Even better is to generate a point in polar coordinates though: pick θ from [0, 2π) and r2 from [0, R2] (ie. multiply R by the square-root of a random number in [0, 1] - without the square-root it is non-uniform).

Related Question