In this Leetcode Generate Random Point in a Circle problem solution Given the radius and the position of the center of a circle, implement the function randPoint which generates a uniform random point inside the circle.
Implement the Solution class:
Solution(double radius, double x_center, double y_center) initializes the object with the radius of the circle radius and the position of the center (x_center, y_center).
randPoint() returns a random point inside the circle. A point on the circumference of the circle is considered to be in the circle. The answer is returned as an array [x, y].
Problem solution in Python.
class Solution(object): def __init__(self, radius, x_center, y_center): """ :type radius: float :type x_center: float :type y_center: float """ self.radius = radius self.x_center = x_center self.y_center = y_center def randPoint(self): """ :rtype: List[float] """ theta = 2*math.pi*random.random() r = self.radius * math.sqrt(random.random()) x = self.x_center + r * math.cos(theta) y = self.y_center + r * math.sin(theta) return [x, y]
Problem solution in Java.
public class Solution { double radius; double xCentre; double yCentre; public Solution(double radius, double x_center, double y_center) { this.radius = radius; this.xCentre = x_center; this.yCentre = y_center; } public double[] randPoint() { double randomRadius = Math.sqrt(Math.random()) * radius; double angle = Math.random() * 2 * Math.PI; double x = xCentre + randomRadius * Math.cos(angle); double y = yCentre + randomRadius * Math.sin(angle); return new double[]{x, y}; } }
Problem solution in C++.
class Solution {
public:
double r;
double x;
double y;
Solution(double radius, double x_center, double y_center) {
r = radius;
x = x_center;
y = y_center;
}
vector<double> randPoint() {
double x_, y_;
do{
double rand_double_x = (double)rand() / RAND_MAX; // Gets random double between [0,1]
double rand_double_y = (double)rand() / RAND_MAX;
x_ = (2*(rand_double_x) - 1.0) * r; //To get [-1, 1]
y_ = (2*(rand_double_y) - 1.0) * r; //To get [-1, 1]
} while(x_*x_ + y_*y_ > r*r);
return {x+x_, y+y_};
}
};