478. Generate Random Point in a Circle

ss
Mar 18, 2021

--

天啊, 一開始也是沒有想法, 後來看討論才知道要用到一個已經失傳已久的名詞, 極座標…

有了極座標, 我們可以只用半徑跟角度就可以找出圓的座標

所以變相是我們只需要去隨機產生出角度跟半徑就行了

半徑會給我們
角度就是360度 用(double)rand()/RAND_MAX找出[0,1]的值

這邊注意在隨機產生半徑, 不要直接用 r * (double)rand()/RAND_MAX

為什麼呢

x = r * cos(theta)
y = r * sin(theta)
r^2 = x^2 + y^2
([0, 1] r ^ 2) = ([0, 1](x ^ 2 + y ^ 2))
([0, 1]r)^2 = ([0, 1](x ^ 2 + y ^ 2))

上面一個簡略地推倒, 可以看到若我們要產生[0, 1]的rand number, 要做開根號才能符合實際的機率

class Solution {
public:
Solution(double radius, double x_center, double y_center) {
this->radius = radius;
xcenter = x_center;
ycenter = y_center;
}
vector<double> randPoint() {
double theta = 2 * M_PI * ((double)rand() / RAND_MAX);
double r = sqrt((double)rand() / RAND_MAX) * radius;
return {xcenter + r * cos(theta) , ycenter + r * sin(theta)};
}
double radius;
double xcenter;
double ycenter;
};

--

--

ss
ss

No responses yet