Сложность: Medium
Дан радиус и положение центра окружности, реализуйте функцию randPoint, которая генерирует равномерно случайную точку внутри окружности.
Реализуйте класс Solution:
- Solution(double radius, double x_center, double y_center) инициализирует объект с радиусом окружности radius и положением центра (x_center, y_center).
- randPoint() возвращает случайную точку внутри окружности. Точка на окружности считается находящейся внутри окружности. Ответ возвращается в виде массива [x, y].
Пример:
Input
["Solution", "randPoint", "randPoint", "randPoint"]
[[1.0, 0.0, 0.0], [], [], []]
Output
[null, [-0.02493, -0.38077], [0.82314, 0.38945], [0.36572, 0.17248]]
Explanation
Solution solution = new Solution(1.0, 0.0, 0.0);
solution.randPoint(); // return [-0.02493, -0.38077]
solution.randPoint(); // return [0.82314, 0.38945]
solution.randPoint(); // return [0.36572, 0.17248]
👨💻 Алгоритм:
1⃣Генерируем равномерно случайные точки в квадрате S с длиной стороны 2R.
2⃣Сохраняем все точки, которые находятся на расстоянии не более R от центра, и отклоняем все, которые дальше этого расстояния.
3⃣Повторяем процесс до получения нужного количества точек, учитывая, что примерно 78.5% от всех сгенерированных точек будут приемлемыми, и ожидаемое число попыток до получения приемлемой точки составляет примерно 1.274 раза.
😎 Решение:
class Solution {
private $rad, $xc, $yc;
function __construct($radius, $x_center, $y_center) {
$this->rad = $radius;
$this->xc = $x_center;
$this->yc = $y_center;
}
function randPoint() {
$x0 = $this->xc - $this->rad;
$y0 = $this->yc - $this->rad;
while (true) {
$xg = $x0 + lcg_value() * $this->rad * 2;
$yg = $y0 + lcg_value() * $this->rad * 2;
if (sqrt(pow($xg - $this->xc, 2) + pow($yg - $this->yc, 2)) <= $this->rad) {
return array($xg, $yg);
}
}
}
}Ставь 👍 и забирай 📚 Базу знаний
