给定四个整数N、R、X 和 Y ,使其表示一个半径为R的圆,以[X, Y]作为中心坐标。任务是在圆内或圆上找到N 个随机点。
例子:
Input: R = 12, X = 3, Y = 3, N = 5
Output: (7.05, -3.36) (5.21, -7.49) (7.53, 0.19) (-2.37, 12.05) (1.45, 11.80)
Input: R = 5, X = 1, Y = 1, N = 3
Output: (4.75, 1.03) (2.57, 5.21) (-1.98, -0.76)
方法:要在圆内或圆上找到随机点,我们需要两个分量,角度(θ)和距中心的距离(D) 。之后,点 (x i , y i ) 可以表示为:
xi = X + D * cos(theta)
yi = Y + D * sin(theta)
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
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 > randPoint(
int r, int x, int y, int n)
{
// Result vector
vector > 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 > A)
{
// Iterate over A
for (pair 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 randPoint(int r, int x,
int y, int n)
{
// Result vector
Vector res = new Vector();
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 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
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 randPoint(int r, int x,
int y, int n)
{
// Result vector
List res = new List();
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 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
输出:
(7.05, -3.36)
(5.21, -7.49)
(7.53, 0.19)
(-2.37, 12.05)
(1.45, 11.80)
时间复杂度: O(N)
空间复杂度: O(N)