Create Random Number Within An Annulus
Solution 1:
In general you can either draw the correct distribution directly or use rejection.
To draw directly use
- draw theta uniformly on [0,2pi):
theta = random.uniform(0,2*pi)
draw r from the power-law distribution r^1.
The only complexity compared to doing this for a circle is that you PDF runs from [r_min,r_max] not [0,r_max]. This leads to
CDF = A \int_{r_min}^{r} r' dr' = A (r^2 - r_min^2)/2
for A the normalizing constant
A = 2/(r_max*r_max - r_min*r_min)
implying that
r = sqrt(2*random.uniform(0,1)/A + r_min*r_min)
and you can simplify slightly.
then compute (x,y) by the usual transformation from radial coordinates
x = r * cos(theta)
y = r * sin(theta)
This method of integrating the PDF, normalizing the CDF and inverting is general and is sometimes called the "Fundamental Theorem of Sampling".
Rejection
Draw (x,y) on a box big enough to contain the annulus, then reject all cases where `r = sqrt(xx + yy) exceeds r_max or is less than r_min.
This is reasonably efficient if the hole in the middle is small, and very inefficient if the hole is large.
Post a Comment for "Create Random Number Within An Annulus"