leetcode第478题 在圆内随机生成点

该博客探讨了LeetCode第478题的解决方案,即如何在圆内随机生成点。博主分享了两种方法:方法一基于勾股定理,但未能通过测试;方法二直接在半径范围内随机生成x和y坐标,条件满足则为圆内点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode第478题 在圆内随机生成点

方法一(不知道为啥过不了)

先在半径上任意取一个点,到圆心的距离为x,然后用勾股定理,根据半径和x的值,可以算出来在从x到圆上的最大距离y_max,再在这上面随便选一个点y,然后加上原来的圆心坐标,就是所取到的点

class Solution {
public:
    double radius, x_center,y_center;
    Solution(double radius, double x_center, double y_center) {
        this->radius=radius;
        this->x_center=x_center;
        this->y_center=y_center;
    }
    
    vector<double> randPoint() {
        //在半径上生成一个点
        double rx=(2.0*rand()/RAND_MAX-1)*radius;
        //根据半径上的点算出y可以到的最大值
        double yMax=sqrt(radius*radius-rx*rx);
        //随机生成一个y的点,在y的范围内
        double ry=(2.0*rand()/RAND_MAX-1)*yMax;
        return {rx+x_center,ry+y_center};

    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(radius, x_center, y_center);
 * vector<double> param_1 = obj->randPoint();
 */

方法二

随机在0-r之间生成x和y,如果对应的坐标(x,y)在以半径为r,圆心为(0,0)的圆上,就在圆内,加上原来的圆心值就是要求的值

class Solution {
public:
    double xc, yc, rad;
    Solution(double radius, double x_center, double y_center) {
        srand(1);
        rad = radius;
        xc = x_center;
        yc = y_center;
    }
    
    vector<double> randPoint() {
        while (true) {
            double x = 2 * (double)rand() / RAND_MAX - 1; // 产生[-1, 1]之间的随机数
            double y = 2 * (double)rand() / RAND_MAX - 1;
            if (x * x + y * y <= 1) {
                return {xc + x * rad, yc + y * rad}; // 对半径进行放缩
            }
        }   
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值