1.在圆内生成随机点
题目:
给定圆的半径和圆心的 x、y 坐标,写一个在圆中产生均匀随机点的函数 randPoint 。
说明:
输入值和输出值都将是浮点数。
圆的半径和圆心的 x、y 坐标将作为参数传递给类的构造函数。
圆周上的点也认为是在圆中。
randPoint 返回一个包含随机点的x坐标和y坐标的大小为2的数组。
思路:简单直接的思路,就是拒绝采样。我们不能直接获取圆内的随机数,但是可以获取正方形区域的随机数。因此可以随机在对应的正方形内取点,然后判断是否在圆内,如果在圆内就返回,不在圆内就继续取
时间复杂度:正常O(1),极端情况正无穷。空间复杂度O(1)
/**
* @param {number} radius
* @param {number} x_center
* @param {number} y_center
*/
var Solution = function (radius, x_center, y_center) {
this.center = [x_center, y_center];
this.radius = radius;
};
/**
* @return {number[]}
*/
Solution.prototype.randPoint = function () {
const xLeft = this.center[0] - this.radius;
const yBottom = this.center[1] - this.radius;
let x = xLeft + Math.random() * 2 * this.radius;
let y = yBottom + Math.random() * 2 * this.radius;
while (
(x - this.center[0]) * (x - this.center[0]) +
(y - this.center[1]) * (y - this.center[1]) >
this.radius * this.radius
) {
x = xLeft + Math.random() * 2 * this.radius;
y = yBottom + Math.random() * 2 * this.radius;
}
return [x, y];
};
/**
* Your Solution object will be instantiated and called as such:
* var obj = new Solution(radius, x_center, y_center)
* var param_1 = obj.randPoint()
*/
也可以用分布函数的 方式。可以在360°内随机取一个角度,然后计算正弦和余弦,在随机取一个半径。因为涉及到扇形,所以要在0-r2内随机取然后开方
时间复杂度O(1),空间复杂度O(1)
/**
* @param {number} radius
* @param {number} x_center
* &