Як генерувати випадкову точку в колі радіуса R :
r = R * sqrt(random())
theta = random() * 2 * PI
(Припустимо, random()
що значення має між 0 і 1 рівномірно)
Якщо ви хочете перетворити це на декартові координати, ви можете зробити це
x = centerX + r * cos(theta)
y = centerY + r * sin(theta)
Чому sqrt(random())
?
Давайте розглянемо математику, яка веде до sqrt(random())
. Припустимо для простоти, що ми працюємо з одиничним колом, тобто R = 1.
Середня відстань між точками має бути однаковою незалежно від того, наскільки далеко ми від центру дивимось. Це означає, наприклад, що, дивлячись на периметр кола з окружністю 2, ми повинні знайти вдвічі більше точок, ніж кількість точок по периметру кола з окружністю 1.
Оскільки окружність кола (2π r ) лінійно зростає з r , то випливає, що кількість випадкових точок повинно лінійно зростати з r . Іншими словами, потрібна щільність функції (PDF) лінійно зростає. Оскільки PDF має мати площу, рівну 1, а максимальний радіус - 1, у нас є
Отже, ми знаємо, як повинна виглядати бажана щільність наших випадкових значень. Тепер: Як ми можемо генерувати таке випадкове значення, коли все, що ми маємо, є рівномірним випадковим значенням між 0 і 1?
Ми використовуємо трюк, який називається вибіркою зворотного перетворення
- З PDF створіть функцію накопичувального розподілу (CDF)
- Дзеркало це вздовж y = x
- Застосуйте отриману функцію до рівномірного значення між 0 і 1.
Звучить складно? Дозвольте мені вставити блок-котирування з невеликою бічною доріжкою, яка передає інтуїцію:
Припустимо, ми хочемо генерувати випадкову точку з таким розподілом:
Це є
- 1/5 точок рівномірно між 1 і 2, і
- 4/5 балів рівномірно між 2 і 3.
CDF, як випливає з назви, є сукупною версією PDF. Інтуїтивно зрозуміло: хоча PDF ( x ) описує кількість випадкових значень на x , CDF ( x ) описує кількість випадкових значень менше x .
У цьому випадку CDF виглядатиме так:
Щоб побачити, як це корисно, уявіть, що ми стріляємо кулями зліва направо на рівномірно розподіленій висоті. Коли кулі потрапляють у лінію, вони опускаються на землю:
Подивіться, як щільність куль на землі відповідає нашому бажаному розподілу! Ми майже там!
Проблема полягає в тому, що для цієї функції вісь y - вихід, а вісь x - вхід . Ми можемо лише «стріляти кулями з землі прямо вгору»! Нам потрібна обернена функція!
Ось чому ми відображаємо все це; x стає y і y стає x :
Ми називаємо це CDF -1 . Для отримання значень відповідно до потрібного розподілу використовуємо CDF -1 (випадковий ()).
… Так, повернемося до генерації випадкових значень радіуса, де наш PDF дорівнює 2 x .
Крок 1: Створіть CDF:
Оскільки ми працюємо з реалами, CDF виражається як інтеграл PDF.
CDF ( x ) = ∫ 2 x = x 2
Крок 2: Дзеркало CDF вздовж y = x :
Математично це зводиться до заміни x і y та вирішення для y :
CDF : y = x 2
Зміна: x = y 2
Розв’яжіть: y = √ x
CDF -1 : y = √ x
Крок 3: Застосуйте отриману функцію до рівномірного значення між 0 і 1
CDF -1 (випадковий ()) = √ випадковий ()
Що ми маємо на меті отримати :-)