Generate Random Point in a Circle,LeetCode,478

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]

解题思路

要随机生成圆内的一个点,可以使用极坐标的方法。具体步骤如下:

  1. 生成随机半径:由于圆的面积与半径的平方成正比,直接均匀生成半径会导致点集中在圆心附近。因此,我们需要生成一个与半径平方成正比的随机数。具体来说,可以生成一个[0, 1]之间的随机数,然后取其平方根,再乘以圆的半径。
  2. 生成随机角度:在[0, 2π]之间均匀生成一个随机角度。
  3. 转换为直角坐标:使用极坐标到直角坐标的转换公式:
    • x = r * cos(θ)
    • y = r * sin(θ)
  4. 平移到圆心:将生成的点平移到给定的圆心位置。

代码实现

以下是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()) # 返回一个随机点

解释

  1. 初始化:在构造函数中,我们存储了圆的半径和圆心的坐标。
  2. 生成随机点
    • math.sqrt(random.random())生成一个[0, 1]之间的随机数的平方根,确保生成的半径符合圆的面积分布。
    • random.uniform(0, 2 * math.pi)生成一个[0, 2π]之间的随机角度。
    • 使用极坐标到直角坐标的转换公式计算出点的坐标。
    • 最后将生成的点平移到圆心位置。

这种方法能够均匀地在圆内生成随机点,符合题目要求。

希望这个详细的解答对你有帮助!如果有其他问题,欢迎继续提问。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注