c++圆圈中的随机点-我哪里出错了?

ulmd4ohb  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(124)
class Solution {
private:
double c_radius;
double xcenter;
double ycenter;

public:
    Solution(double radius, double x_center, double y_center) {
    c_radius = radius;
    xcenter = x_center;
    ycenter = y_center;  
}

vector<double> randPoint() {
    double randomradius= (sqrt((double)rand()) / RAND_MAX) * c_radius;
    double randomangle= ((double)rand() / RAND_MAX) * 360.0;
    double yp= sin(randomangle)*randomradius;
    double xp= cos(randomangle)*randomradius;
    std::vector<double> point= {xp+xcenter, yp+ycenter};
    return point; 
}
};

大家好,我正在做一个关于寻找一个圆圈内的随机点Leet代码问题。它一切顺利,直到以下测试:* * 输入值:**[0.01、-73839.1、-3289891.3]
它本质上是在一个圆内生成一个随机点,但我的结果似乎被四舍五入,我不知道为什么。

    • 生成点后我的输出:**
[null,[-73839.10**000**,-3289891.30**000**],[-73839.10**000**,-3289891.30000],[-73839.10000,-3289891.30000],[-73839.10000,-3289891.30000],[-73839.10000,-3289891.30000]...
    • 预期产出**
[null,[-73839.10**006**,-3289891.30**228**],[-73839.10**541**,-3289891.30660],[-73839.10634,-3289891.30124],[-73839.10256,-3289891.30684],[-73839.09825,-3289891.29962]...

现在我的问题是错误在哪里?我的数学有问题吗?结果很接近,但还不够接近。我似乎不能准确指出这个错误发生在哪里。任何帮助都非常感谢。

mqkwyuun

mqkwyuun1#

用你目前的方法你将不会得到均匀的分布(即使弧度是固定的)。点将集中在一个中心。
Task description说点分布假设是均匀的,但我怀疑是否编写了适当的统计检验。
与其复杂化,不如在包含圆的正方形中随机选取坐标,并不断生成这个点,直到它适合圆。

class Solution {
    std::mt19937 gen;
    std::uniform_real_distribution<> dis;
    double xc;
    double yc;
    double r2;

public:
    Solution(double radius, double x_center, double y_center) 
        : dis{-radius, radius}
        , xc{x_center}
        , yc{y_center}
        , r2{radius * radius}
    {
    }
    
    std::vector<double> randPoint() {
        double dx, dy;
        do {
            dx = dis(gen);
            dy = dis(gen);
        } while (dx*dx + dy*dy > r2);
        return {xc + dx, yc + dy};
    }
};
k4emjkb1

k4emjkb12#

谢谢大家的帮助。看来我有sqrt()操作在错误的地方。使用sqrt()后,我计算的结果rand()/RAND_MAX通过测试。(感谢chrysante)完整的代码:

class Solution {
private:
double c_radius;
double xcenter;
double ycenter;

public:
Solution(double radius, double x_center, double y_center) {
    c_radius = radius;
    xcenter = x_center;
    ycenter = y_center;  
}

vector<double> randPoint() {
    double randomradius= sqrt(((double)rand() / RAND_MAX)) * c_radius;
    double randomangle= ((double)rand() / RAND_MAX) * 360.0;
    double yp= sin(randomangle)*randomradius;
    double xp= cos(randomangle)*randomradius;
    return {xp+xcenter, yp+ycenter};
}
};

此代码通过了所有Leetcode测试。rand()/RAND_MAX的平方根结果是必要的,否则它将抛出相同的错误,在原来的职位。

相关问题