How to generate random points on a sphere?

Solution 1:

Use the fact that if you cut a sphere of a given radius with two parallel planes, the area of the strip of spherical surface between the planes depends only on the distance between the planes, not on where they cut the sphere. Thus, you can get a uniform distribution on the surface using two uniformly distributed random variables:

  • a $z$-coordinate, which in your case should be chosen between $-10$ and $10$; and
  • an angle in $[0,2\pi)$ corresponding to a longitude.

From those it’s straightforward to generate the $x$- and $y$-coordinates.

Solution 2:

Using Gaussian distribution for all three coordinates of your point will ensure an uniform distribution on the surface of the sphere. You should proceed as follows

  1. Generate three random numbers $x, y, z$ using Gaussian distribution
  2. Multiply each number by $1/\sqrt{x^2+y^2+z^2}$ (a.k.a. Normalise) . You should handle what happens if $x=y=z=0$.
  3. Multiply each number by the radius of your sphere.

Solution 3:

Here is a simple but less efficient way:

Generate points uniformly $x \in [-10,10]^3$ and reject if $\|x\| =0 $ (which should rarely happen) or $\|x\| > 10$ (which should happen with probability ${20^3 -{4 \over 3} \pi 10^3 \over 20^3} =1 - {\pi \over 6} \approx 48\%$). Otherwise let $y = {10 \over \|x\|} x$. Then $y$ will be distributed uniformly on the surface of the $10$-sphere.

Solution 4:

In addition to Brian Scott's excellent and clever answer, here's another, more straightforward way (in case you want to approach it with a geographical intuition): From two random variables $u_1, u_2$, distributed uniformly on the interval $[0, 1]$, generate (in radians) the latitude

$$ \lambda = \arccos (2u_1-1)-\frac{\pi}{2} $$

and the longitude

$$ \phi = 2\pi u_2 $$

Then compute the rectangular coordinates accordingly:

$$ x = \cos\lambda\cos\phi $$ $$ y = \cos\lambda\sin\phi $$ $$ z = \sin\lambda $$

ETA (thanks to Tanner Strunk—see comments): This will give coordinates of points on the unit sphere. To have them land on the sphere with diameter $20$ (and therefore radius $10$), simply multiply each by $10$.