LeetCode 478 Generate Random Point in a Circle 在圆中生成随机点
题目
题意
给你一个圆的半径和圆心坐标,编写函数randPoint 函数返回在圆内的随机点
分析
题意很简单,是生成随机数的变种,这里的随机变成了两维,且随机值为浮点型
我们可以使用 随机点与x轴构成的夹角θ作为随机变量,这种情况下
$x=xCenter+cos(θ)*radius $
\(y=yCenter+sin(θ)*radius\)
对于浮点型随机变量的生成可以采用两者方法
STL函数直接生成
default_random_engine random; //随机种子
uniform_real_distribution<double> dis(low,upper); //设置随机数范围
cout<<dis(random); //生成随机数
该方法是c++11算法中的新特性,随机性效果更好,操作简单
使用原始的Rand进行处理
原始Rand返回值的范围为0-RAND_MAX;
可以使用 (double)rand()/RAND_MAX; 的方法来产生介于0-1之间的浮点数
代码
class Solution {
public:
const double PI = 3.14159265358979732384626433832795;
double m_radius, m_x_center, m_y_center;
double uniform() {
return (double)rand() / RAND_MAX;
}
Solution(double radius, double x_center, double y_center) {
m_radius = radius; m_x_center = x_center; m_y_center = y_center;
}
vector<double> randPoint() {
double theta = 2 * 3.14159265358979323846264 * uniform();
double r = sqrt(uniform());
return vector<double>{
m_x_center + r * m_radius * cos(theta),
m_y_center + r * m_radius * sin(theta)
};
}
};