478. Generate Random Point in a Circle
Posted liaohuiqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了478. Generate Random Point in a Circle相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章
zenefits oa - random to generate a random
cpp generate template random number
python generate_random_rsis.py
Java – Generate random integers in a range
[LeetCode] Generate Random Point in a Circle ????????????????????????