represent the cosine and sine of the angle that the vector (x, y) makes with x axis.
The underlying theory may be summarized as follows: If u is uniformly distributed in the interval 0 ≤ u < 1, then the point (cos(2πu), sin(2πu)) is uniformly distributed on the unit circumference x2 + y2 = 1, and multiplying that point by an independent random variable ρ whose distribution is will produce a point whose coordinates are jointly distributed as two independent standard normal random variables.
This idea dates back to Laplace, whom Gauss credits with finding the above by taking the square root of The transformation to polar coordinates makes evident that θ is uniformly distributed (constant density) from 0 to 2π, and that the radial distance r has density (r2 has the appropriate chi square distribution.)
This method of producing a pair of independent standard normal variates by radially projecting a random point on the unit circumference to a distance given by the square root of a chi-square-2 variate is called the polar method for generating a pair of normal random variables, A direct application of this idea, is called the Box–Muller transform, in which the chi variate is usually generated as but that transform requires logarithm, square root, sine and cosine functions.
On some processors, the cosine and sine of the same argument can be calculated in parallel using a single instruction.
Then In contrast, the polar method here removes the need to calculate a cosine and sine.
Instead, by solving for a point on the unit circle, these two functions can be replaced with the x and y coordinates normalized to the
and forming the point which is a faster procedure than calculating the cosine and sine.
Some researchers argue that the conditional if instruction (for rejecting a point outside of the unit circle), can make programs slower on modern processors equipped with pipelining and branch prediction.
[4] Also this procedure requires about 27% more evaluations of the underlying random number generator (only
of generated points lie inside of unit circle).
A simple Julia implementation:The for loop can be parallelized by using the Threads.