LeetCode 478题是“生成随机点在圆内”(Generate Random Point in a Circle),这是一个中等难度的题目,主要考察的是数学和随机数生成的知识。
题目描述
给定圆的半径和圆心位置,要求随机生成圆内的一个点。
示例:
输入:
["Solution", "randPoint", "randPoint", "randPoint"]
[[1.0, 0.0, 0.0], [], [], []]
输出: [null, [-0.02493, -0.38077], [0.82314, 0.38945], [0.36572, 0.17248]]
解释:
Solution solution = new Solution(1.0, 0.0, 0.0);
solution.randPoint(); // 返回[-0.02493, -0.38077]
solution.randPoint(); // 返回[0.82314, 0.38945]
solution.randPoint(); // 返回[0.36572, 0.17248]
解题思路
要随机生成圆内的一个点,可以使用极坐标的方法。具体步骤如下:
- 生成随机半径:由于圆的面积与半径的平方成正比,直接均匀生成半径会导致点集中在圆心附近。因此,我们需要生成一个与半径平方成正比的随机数。具体来说,可以生成一个[0, 1]之间的随机数,然后取其平方根,再乘以圆的半径。
- 生成随机角度:在[0, 2π]之间均匀生成一个随机角度。
-
转换为直角坐标:使用极坐标到直角坐标的转换公式:
- x = r * cos(θ)
- y = r * sin(θ)
- 平移到圆心:将生成的点平移到给定的圆心位置。
代码实现
以下是Python的实现代码:
import random
import math
class Solution: def init(self, radius: float, x_center: float, y_center: float): self.radius = radius self.x_center = x_center self.y_center = y_center
def randPoint(self):
# 生成随机半径
r = self.radius * math.sqrt(random.random())
# 生成随机角度
theta = random.uniform(0, 2 * math.pi)
# 转换为直角坐标
x = r * math.cos(theta)
y = r * math.sin(theta)
# 平移到圆心
return [self.x_center + x, self.y_center + y]
示例使用
solution = Solution(1.0, 0.0, 0.0) print(solution.randPoint()) # 返回一个随机点 print(solution.randPoint()) # 返回一个随机点 print(solution.randPoint()) # 返回一个随机点
解释
- 初始化:在构造函数中,我们存储了圆的半径和圆心的坐标。
- 生成随机点:
math.sqrt(random.random())
生成一个[0, 1]之间的随机数的平方根,确保生成的半径符合圆的面积分布。random.uniform(0, 2 * math.pi)
生成一个[0, 2π]之间的随机角度。- 使用极坐标到直角坐标的转换公式计算出点的坐标。
- 最后将生成的点平移到圆心位置。
这种方法能够均匀地在圆内生成随机点,符合题目要求。
希望这个详细的解答对你有帮助!如果有其他问题,欢迎继续提问。
发表回复