给定圆的半径和圆心的位置,实现函数
randPoint
,在圆中产生均匀随机点。实现
Solution
类:
Solution(double r, double x, double y) 用圆的半径 radius 和圆心的位置 (x, r) 初始化对象
randPoint()
返回圆内的一个随机点。圆周上的一点被认为在圆内。答案作为数组返回[x, y]
。
题目我也是第一次做,建议先去做一下470. 用 Rand7() 实现 Rand10() - 力扣(LeetCode)
这道题可以理解一下《拒绝抽样》思想
做完这道题以后,我们在仔细想一想,题目到底什么意思,
我们看一下样例:
输入:
["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]
我们发现,返回的[x,y]点是在指定的r圆内的,我们看一下下图:
如图所示,三个随机[x,y]表示的黑点,都在圆内,就是满足的
我们看一下代码:
class Solution {
double x1;
double y1;
double r;
Random ran=new Random();
public Solution(double radius, double x_center, double y_center) {
this.x1=x_center;
this.y1=y_center;
this.r=radius;
}
public double[] randPoint() {
while(true){
double x= ran.nextDouble()*(2*r)-r;
double y= ran.nextDouble()*(2*r)-r;//减去r的原因是直接随机的话,获取不到圆的顶点;
if(x*x+y*y<=r*r){//判断是否在圆圈内
return new double[]{x1+x,y1+y};
}
}
}
}
你们肯定很好奇为啥要2*r,因为我们随机获取的范围是在(2*r)^2正方形里面,直接*r-r最后一个样例过不去,也不符合我们解题本题的思想