LeetCode 478. 在圆内随机生成点(拒绝采样)

给定圆的半径和圆心的位置,实现函数 randPoint ,在圆中产生均匀随机点。

这道题的核心是均匀,如果使用极坐标取随机的角度和半径,就会导致半径小的取点比较密集,可以绘制看一下。

所以本题是拒绝采样(我这么做了之后才知道还有个专业术语)

class Solution:

    def __init__(self, radius: float, x_center: float, y_center: float):
        self.x_center = x_center
        self.y_center = y_center
        self.radius = radius


    def randPoint(self) -> List[float]:
        left_down_x = self.x_center - self.radius
        left_down_y = self.y_center - self.radius

        ran1 = random.randint(0, 3*10**4)/(3*10**4)
        ran2 = random.randint(0, 3*10**4)/(3*10**4)

        x = left_down_x + ran1 * 2 * self.radius
        y = left_down_y + ran2 * 2 * self.radius

        while (x - self.x_center) ** 2 + (y - self.y_center) ** 2 > self.radius ** 2:
            return self.randPoint()
        
        return [x, y]

# Your Solution object will be instantiated and called as such:
# obj = Solution(radius, x_center, y_center)
# param_1 = obj.randPoint()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容