码迷,mamicode.com
首页 > 其他好文 > 详细

478. Generate Random Point in a Circle

时间:2018-10-26 20:32:55      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:reject   float   random   随机   方法   object   list   问题解决   https   

1. 问题

给定一个圆的半径和圆心坐标,生成圆内点的坐标。

2. 思路

简单说

(1)在圆内随机取点不好做,但是如果画出这个圆的外接正方形,在正方形里面采样就好做了。
(2)取两个random确定正方形内的横坐标和纵坐标即可在正方形内采样。
(3)如果采样到的点不在圆内,则丢弃,继续采样,当采样的点在圆内,则返回该点。
(4)这样采样可以视作在圆内采样的一种近似,到这里就可以把问题解决了。下面是一些扩展知识。

拒绝采样(Reject Sampling)的解释

这个方法利用了拒绝采样的方法,该方法的详细阐述我在前一篇文章470. Implement Rand10() Using Rand7() (拒绝采样Reject Sampling)中提过,下面的解释以这里面拒绝采样的介绍为基础,沿用里面的符号和式子。

把圆内点的分布当作p(x),圆内可以看作有 \(\pi r^2\)个点,每个点的概率为 $ 1 / (\pi r^2) $。
然后把正方形内点的分布当作q(x),正方形内可以看作有 \(4r^2\)个点,每个点的概率为 $1 / (4r^2) $。
这里我们M取\(4/\pi\)
我们在\(q(x)\)上采点,每个点采到的概率为$1 / (4r^2) $,乘上M就是 $ 1 / (\pi r^2) \(,对于每个随机变量,\)M * q(x)\(为\) 1 / (\pi r^2) \(。\)p(x)\(是圆内点的分布,当采到的点在圆内时,\) p(x) = 1 / (\pi r^2) \(,那么接受概率为\)p(x) / (M * q(x))\(就是1。当采到的点在圆外时,\)p(x)$为0,所以接受概率为0。

3. 代码

class Solution(object):
    def __init__(self, radius, x_center, y_center):
        """
        :type radius: float
        :type x_center: float
        :type y_center: float
        """
        self.radius = radius
        self.x_center = x_center
        self.y_center = y_center

    def randPoint(self):
        """
        :rtype: List[float]
        """
        while True:
            x = (self.x_center - self.radius) + random.random() * self.radius * 2
            y = (self.y_center - self.radius) + random.random() * self.radius * 2
            if (x - self.x_center) ** 2 + (y - self.y_center) ** 2 <= self.radius ** 2:
                return [x, y]

4. 类似题目

470. Implement Rand10() Using Rand7() (拒绝采样Reject Sampling)

478. Generate Random Point in a Circle

标签:reject   float   random   随机   方法   object   list   问题解决   https   

原文地址:https://www.cnblogs.com/liaohuiqiang/p/9858394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!