Dados cuatro enteros N, R, X e Y tales que representa un círculo de radio R con [X, Y] como coordenadas del centro. La tarea es encontrar N puntos aleatorios dentro o sobre el círculo.
Ejemplos:
Entrada: R = 12, X = 3, Y = 3, N = 5
Salida: (7,05, -3,36) (5,21, -7,49) (7,53, 0,19) (-2,37, 12,05) (1,45, 11,80)
Entrada: R = 5, X = 1, Y = 1, N = 3
Salida: (4,75, 1,03) (2,57, 5,21) (-1,98, -0,76)
Enfoque: para encontrar un punto aleatorio dentro o sobre un círculo, necesitamos dos componentes, un ángulo (theta) y una distancia (D) desde el centro . Después de eso Ahora, el punto (x i , y i ) se puede expresar como:
xi = X + D * cos(theta) yi = Y + D * sin(theta)
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; #define PI 3.141592653589 // Return a random double between 0 & 1 double uniform() { return (double)rand() / RAND_MAX; } // Function to find the N random points on // the given circle vector<pair<double, double> > randPoint( int r, int x, int y, int n) { // Result vector vector<pair<double, double> > res; for (int i = 0; i < n; i++) { // Get Angle in radians double theta = 2 * PI * uniform(); // Get length from center double len = sqrt(uniform()) * r; // Add point to results. res.push_back({ x + len * cos(theta), y + len * sin(theta) }); } // Return the N points return res; } // Function to display the content of // the vector A void printVector( vector<pair<double, double> > A) { // Iterate over A for (pair<double, double> P : A) { // Print the N random points stored printf("(%.2lf, %.2lf)\n", P.first, P.second); } } // Driver Code int main() { // Given dimensions int R = 12; int X = 3; int Y = 3; int N = 5; // Function Call printVector(randPoint(R, X, Y, N)); return 0; }
Java
// Java program for the above approach import java.util.*; class GFG{ static final double PI = 3.141592653589; static class pair { double first, second; public pair(double first, double second) { super(); this.first = first; this.second = second; } } // Return a random double between 0 & 1 static double uniform(){return Math.random();} // Function to find the N random points on // the given circle static Vector<pair> randPoint(int r, int x, int y, int n) { // Result vector Vector<pair> res = new Vector<pair>(); for(int i = 0; i < n; i++) { // Get Angle in radians double theta = 2 * PI * uniform(); // Get length from center double len = Math.sqrt(uniform()) * r; // Add point to results. res.add(new pair(x + len * Math.cos(theta), y + len * Math.sin(theta))); } // Return the N points return res; } // Function to display the content of // the vector A static void printVector(Vector<pair> A) { // Iterate over A for(pair P : A) { // Print the N random points stored System.out.printf("(%.2f, %.2f)\n", P.first, P.second); } } // Driver Code public static void main(String[] args) { // Given dimensions int R = 12; int X = 3; int Y = 3; int N = 5; // Function call printVector(randPoint(R, X, Y, N)); } } // This code is contributed by Rajput-Ji
Python3
# Python program for the above approach import math import random PI = 3.141592653589; class pair: def __init__(self, first, second): self.first = first; self.second = second; # Return a random between 0 & 1 def uniform(): return random.random(); # Function to find the N random points on # the given circle def randPoint(r, x, y, n): # Result vector res = list(); for i in range(n): # Get Angle in radians theta = 2 * PI * uniform(); # Get length from center len = math.sqrt(uniform()) * r; # Add point to results. res.append(pair((x + len * math.cos(theta)), (y + len * math.sin(theta)))); # Return the N points return res; # Function to display the content of # the vector A def printVector(A): # Iterate over A for P in A: # Print the N random points stored print("({0:.2f}".format(P.first),", ","{0:.2f})".format(P.second)); # Driver Code if __name__ == '__main__': # Given dimensions R = 12; X = 3; Y = 3; N = 5; # Function call printVector(randPoint(R, X, Y, N)); # This code is contributed by 29AjayKumar
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG { static readonly double PI = 3.141592653589; class pair { public double first, second; public pair(double first, double second) { this.first = first; this.second = second; } } // Return a random double between 0 & 1 static double uniform() { return new Random().NextDouble(); } // Function to find the N random points on // the given circle static List<pair> randPoint(int r, int x, int y, int n) { // Result vector List<pair> res = new List<pair>(); for(int i = 0; i < n; i++) { // Get Angle in radians double theta = 2 * PI * uniform(); // Get length from center double len = Math.Sqrt(uniform()) * r; // Add point to results. res.Add(new pair(x + len * Math.Cos(theta), y + len * Math.Sin(theta))); } // Return the N points return res; } // Function to display the content of // the vector A static void printList(List<pair> A) { // Iterate over A foreach(pair P in A) { // Print the N random points stored Console.Write("({0:F2}, {1:F2})\n", P.first, P.second); } } // Driver Code public static void Main(String[] args) { // Given dimensions int R = 12; int X = 3; int Y = 3; int N = 5; // Function call printList(randPoint(R, X, Y, N)); } } // This code is contributed by 29AjayKumar
Javascript
// JavaScript program for the above approach // Return a random double between 0 & 1 function uniform() { return Math.random(); } // Function to find the N random points on // the given circle function randPoint(r, x, y, n) { // Result vector let res = new Array(); for (let i = 0; i < n; i++) { // Get Angle in radians let theta = 2 * Math.PI * uniform(); // Get length from center let len = Math.sqrt(uniform()) * r; // Add point to results. res.push([x + len * Math.cos(theta), y + len * Math.sin(theta)]); } // Return the N points return res; } // Function to display the content of // the vector A function printVector(A) { // Iterate over A for (let i = 0; i < A.length; i++) { // Print the N random points stored console.log("(" + A[i][0].toFixed(2) + ", " + A[i][1].toFixed(2) + ")"); } } // Driver Code // Given dimensions let R = 12; let X = 3; let Y = 3; let N = 5; // Function Call printVector(randPoint(R, X, Y, N)); // The code is contributed by gautam goel (gautamgoel962)
(7.05, -3.36) (5.21, -7.49) (7.53, 0.19) (-2.37, 12.05) (1.45, 11.80)
Complejidad temporal: O(N)
Complejidad espacial: O(N)
Publicación traducida automáticamente
Artículo escrito por AnshulVerma1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA