Ответ 1
В общем, вы можете либо прямо направить правильное распределение, либо отказаться от него.
Для прямого использования
- равномерно нарисовать theta на [0,2pi):
theta = random.uniform(0,2*pi)
-
извлечь r из степенного распределения r ^ 1.
Единственная сложность по сравнению с этим для круга заключается в том, что PDF файл работает от [r_min, r_max], а не [0, r_max]. Это приводит к
CDF = A\int_ {r_min} ^ {r} r 'dr' = A (r ^ 2 - r_min ^ 2)/2
для A нормализующая константа
A = 2/(r_max*r_max - r_min*r_min)
подразумевая, что
r = sqrt(2*random.uniform(0,1)/A + r_min*r_min)
и вы можете немного упростить.
-
затем вычислить (x, y) обычным преобразованием из радиальных координат
x = r * cos(theta)
y = r * sin(theta)
Этот метод интегрирования PDF, нормализующий CDF и инвертирование, является общим и иногда называется "фундаментальной теоремой выборки".
Отрицание
Нарисуйте (x, y) на поле, достаточно большое, чтобы содержать кольцевое пространство, затем отклоните все случаи, когда r = sqrt (xx + yy) превышает r_max или меньше r_min.
Это разумно эффективно, если отверстие в середине небольшое и очень неэффективно, если отверстие большое.