Создание случайного числа в кольцевом пространстве

Я пытаюсь создать случайное число, которое находится внутри кольца, т. Е. Мы имеем максимальный и минимальный радиус. Я пробовал делать:

while True: x=random.uniform(-maxR, maxR) y=random.uniform(-maxR, maxR) R=math.sqrt(x**2 + y**2) if R <= maxRadius and R >= minRadius: if x>= -maxRadius and x <= maxRadius and x<=-minRadius and x>= minRadius: print "passed x" if y>= -maxRadius and y <= maxRadius and y<=-minRadius and y>= minRadius: break 

Но это очень медленно. Можно ли подавать больше random.uniform в random.uniform или есть другой метод?

  • Каков наилучший способ генерации случайных строк определенной длины в Python?
  • Как вы можете выбрать случайный элемент из списка и удалить его?
  • getrandbits не производит номера постоянной длины
  • Сгенерировать несколько случайных чисел, чтобы равное значение в python
  • Случайный int без импорта 'random'
  • Python удаляет элемент из случайного списка, после его выбора
  • Как я могу создать уникальный идентификатор в Python?
  • Python: почему `random.randint (a, b)` возвращает диапазон, включающий `b`?
  • Как выполнить случайное событие в Python, выбрав случайную переменную?
  • Попытка создать серию уникальных случайных чисел
  • Случайный int без импорта 'random'
  • Случайная последовательность Python с семенем
  • 2 Solutions collect form web for “Создание случайного числа в кольцевом пространстве”

    В общем, вы можете либо прямо направить правильное распределение, либо использовать отказ.

    Для прямого использования

    • равномерно натягиваем тету на [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 = 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 (x x + y y) превышает r_max или меньше r_min.

    Это достаточно эффективно, если отверстие в середине небольшое и очень неэффективно, если отверстие большое.

    Метод, который вы используете, должен работать довольно эффективно для толстого кольца (где r1 <<< r2). Если вы имеете дело с узким кольцом (r2 – r1 <<< r1), вы можете вместо этого использовать что-то вроде этого:

     r = random.uniform(r1, r2) theta = random.uniform(0, 2 * PI) x = r * math.sin(theta) y = r * math.cos(theta) 

    Обратите внимание, что это дает слегка неравномерные результаты (существует постоянное распределение точек на единицу угла, а не на единицу площади).

    Python - лучший язык программирования в мире.