解法
解法一:基于几何概型
随机生成一个在外接正方形里的点,如果不在圆里就重新生成
class Solution(object):
def __init__(self, radius, x_center, y_center):
"""
:type radius: float
:type x_center: float
:type y_center: float
"""
self.r = radius
self.x = x_center
self.y = y_center
def randPoint(self):
"""
:rtype: List[float]
"""
x = random.uniform(-self.r,self.r)
y = random.uniform(-self.r,self.r)
while self.r**2<x**2+y**2:
x = random.uniform(-self.r,self.r)
y = random.uniform(-self.r,self.r)
diff = self.r**2-x**2+y**2
return [self.x+x,self.y+y]
解法二:基于极坐标
这里有个坑是角度可以均匀,但是半径不是均匀的,半径大的点概率更高:
C
D
F
(
r
)
=
r
2
R
2
CDF(r)=\frac{r^2}{R^2}
CDF(r)=R2r2
基于特定分布生成随机数的方法可以参考这里
class Solution(object):
def __init__(self, radius, x_center, y_center):
"""
:type radius: float
:type x_center: float
:type y_center: float
"""
self.r = radius
self.x = x_center
self.y = y_center
def randPoint(self):
"""
:rtype: List[float]
"""
r = (random.uniform(0,1)*self.r**2)**0.5
angle = random.uniform(0,360)
# print r, angle
return [self.x+r*math.cos(angle), self.y+r*math.sin(angle)]