C#에서 몬테카를로 방법을 사용하여 π(PI)를 계산하는 방법.
4253 단어 csharp
개요
π는 대략 3.14159와 같은 수학 상수입니다. 원의 둘레와 지름의 비율을 나타냅니다. 그래서 그들이 이 마법의 숫자를 계산한 방법 😀. 실제로 이를 계산하는 방법에는 여러 가지가 있습니다. 가장 유명한 방법 중 하나는 몬테카를로입니다. 이 포스트에서 나는 이것을 수학적으로 수행한 다음 C#을 사용하여 프로그래밍 방식으로 수행할 수 있는 방법을 설명하려고 합니다.
π 공식 찾기
우리는 원의 면적이 다음과 같다는 것을 압니다.A = π(R^2)
여기서 R은 원의 반지름입니다.
π를 분리한 후 공식은 다음과 같아야 합니다.π = A / (R^2)
... (1)
원 분기의 면적은 다음과 같습니다.Q = A / 4
그러면 면적은 다음과 같아야 합니다.A = 4 * Q
... (2)
(1) 공식의 A를 (2) 공식의 (4 * Q)로 변경하면 결과는 다음과 같아야 합니다.π = (4 * Q) / (R^2)
아래 그림을 확인하고 다음 줄을 읽으십시오.
여기서 Q는 원 영역(빨간색 영역만 해당)에서 가져온 포인트 수로 표시할 수 있습니다. R^2는 전체 정사각형 영역(빨간색 및 파란색 영역)의 포인트 수입니다.
따라서 최종 방정식은 다음과 같습니다.π = (4 * M) / (N)
어디에:
M은 원의 점 수입니다.
N은 정사각형의 점 수입니다.
CSharp로 결과 구현:
새 CSharp 콘솔 애플리케이션을 만들어 시작하겠습니다.
먼저 다음과 같이 점 구조(X, Y)를 저장하는 데 도움이 되는 간단한 클래스를 만들었습니다.
using System;
namespace Test
{
internal class Point
{
private double X { get; set; }
private double Y { get; set; }
public Point(double x, double y)
{
X = x;
Y = y;
}
public double GetX()
{
return X;
}
public double GetY()
{
return Y;
}
}
}
그런 다음 기본 클래스는 다음과 같이 작성됩니다.
using System;
namespace Test
{
class Program
{
private static int NumberOfCirclePoints = 0;
private static Random RandomObject = new Random();
private static double GenerateRandomDouble(double min, double max)
{
double d = RandomObject.NextDouble() * (max - min) + min;
return d;
}
static void Main(string[] args)
{
Console.Write("Radius: ");
double radius = Convert.ToDouble(Console.ReadLine());
Console.Write("Center of the circle (eg. 10,2): ");
string center = Console.ReadLine();
Console.Write("How many points? ");
int numberOfPoints = Convert.ToInt32(Console.ReadLine());
string[] centerCoordinates = center.Split(',');
double cx = Convert.ToDouble(centerCoordinates[0].Trim());
double cy = Convert.ToDouble(centerCoordinates[1].Trim());
double scx, scy;
scx = scy = cx + radius;
for (int i = 0; i < numberOfPoints; i++)
{
double cxDouble = GenerateRandomDouble(cx, scx);
double cyDouble = GenerateRandomDouble(cy, scy);
// calculate the distance between the circle center and the given point.
double distance = Math.Sqrt(Math.Pow(cxDouble - cx, 2) + Math.Pow(cyDouble - cy, 2));
// If the distance is less or equal to the radius of the circle then the given point is inside the circle area.
// Else the given point is outisde the circle area.
if (distance <= radius)
NumberOfCirclePoints++;
}
double PI = 4 * (Convert.ToDouble(NumberOfCirclePoints) / Convert.ToDouble(numberOfPoints));
Console.WriteLine($"PI = {PI}");
Console.ReadKey();
}
}
}
위의 for 루프에서 알 수 있듯이 사각형 영역에만 존재하는 임의의 점을 생성하고 있습니다. 반복할 때마다 임의로 생성된 점이 원 안에 있는지 확인합니다. 이는 원의 중심과 임의의 점 사이의 거리를 계산하여 수행할 수 있습니다. 그런 다음 반경과 거리를 비교합니다. 거리가 반지름보다 작거나 같으면 점이 원 안에 있는 것입니다. 이 단계에서 NumberOfCirclePoints 변수를 1씩 늘립니다.
Note: the distance formula is: d = √(x2 - x1)^2 + (y2 - y1)^2
마지막으로 사각형 내에서 취한 점의 수가 많을수록 π 값의 정확도가 높아집니다.
Example:
for the same radius (let's say 100) and center C(0, 0)
1000 points ---> π = 3.208
1000000 points ---> π = 3.142564
읽어주셔서 감사합니다 ❤.
Reference
이 문제에 관하여(C#에서 몬테카를로 방법을 사용하여 π(PI)를 계산하는 방법.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/mohamadhag/how-to-calculate-pi-using-monte-carlo-method-with-c-1bd9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
우리는 원의 면적이 다음과 같다는 것을 압니다.
A = π(R^2)
여기서 R은 원의 반지름입니다.π를 분리한 후 공식은 다음과 같아야 합니다.
π = A / (R^2)
... (1)원 분기의 면적은 다음과 같습니다.
Q = A / 4
그러면 면적은 다음과 같아야 합니다.
A = 4 * Q
... (2)(1) 공식의 A를 (2) 공식의 (4 * Q)로 변경하면 결과는 다음과 같아야 합니다.
π = (4 * Q) / (R^2)
아래 그림을 확인하고 다음 줄을 읽으십시오.
여기서 Q는 원 영역(빨간색 영역만 해당)에서 가져온 포인트 수로 표시할 수 있습니다. R^2는 전체 정사각형 영역(빨간색 및 파란색 영역)의 포인트 수입니다.
따라서 최종 방정식은 다음과 같습니다.
π = (4 * M) / (N)
어디에:M은 원의 점 수입니다.
N은 정사각형의 점 수입니다.
CSharp로 결과 구현:
새 CSharp 콘솔 애플리케이션을 만들어 시작하겠습니다.
먼저 다음과 같이 점 구조(X, Y)를 저장하는 데 도움이 되는 간단한 클래스를 만들었습니다.
using System;
namespace Test
{
internal class Point
{
private double X { get; set; }
private double Y { get; set; }
public Point(double x, double y)
{
X = x;
Y = y;
}
public double GetX()
{
return X;
}
public double GetY()
{
return Y;
}
}
}
그런 다음 기본 클래스는 다음과 같이 작성됩니다.
using System;
namespace Test
{
class Program
{
private static int NumberOfCirclePoints = 0;
private static Random RandomObject = new Random();
private static double GenerateRandomDouble(double min, double max)
{
double d = RandomObject.NextDouble() * (max - min) + min;
return d;
}
static void Main(string[] args)
{
Console.Write("Radius: ");
double radius = Convert.ToDouble(Console.ReadLine());
Console.Write("Center of the circle (eg. 10,2): ");
string center = Console.ReadLine();
Console.Write("How many points? ");
int numberOfPoints = Convert.ToInt32(Console.ReadLine());
string[] centerCoordinates = center.Split(',');
double cx = Convert.ToDouble(centerCoordinates[0].Trim());
double cy = Convert.ToDouble(centerCoordinates[1].Trim());
double scx, scy;
scx = scy = cx + radius;
for (int i = 0; i < numberOfPoints; i++)
{
double cxDouble = GenerateRandomDouble(cx, scx);
double cyDouble = GenerateRandomDouble(cy, scy);
// calculate the distance between the circle center and the given point.
double distance = Math.Sqrt(Math.Pow(cxDouble - cx, 2) + Math.Pow(cyDouble - cy, 2));
// If the distance is less or equal to the radius of the circle then the given point is inside the circle area.
// Else the given point is outisde the circle area.
if (distance <= radius)
NumberOfCirclePoints++;
}
double PI = 4 * (Convert.ToDouble(NumberOfCirclePoints) / Convert.ToDouble(numberOfPoints));
Console.WriteLine($"PI = {PI}");
Console.ReadKey();
}
}
}
위의 for 루프에서 알 수 있듯이 사각형 영역에만 존재하는 임의의 점을 생성하고 있습니다. 반복할 때마다 임의로 생성된 점이 원 안에 있는지 확인합니다. 이는 원의 중심과 임의의 점 사이의 거리를 계산하여 수행할 수 있습니다. 그런 다음 반경과 거리를 비교합니다. 거리가 반지름보다 작거나 같으면 점이 원 안에 있는 것입니다. 이 단계에서 NumberOfCirclePoints 변수를 1씩 늘립니다.
Note: the distance formula is: d = √(x2 - x1)^2 + (y2 - y1)^2
마지막으로 사각형 내에서 취한 점의 수가 많을수록 π 값의 정확도가 높아집니다.
Example:
for the same radius (let's say 100) and center C(0, 0)
1000 points ---> π = 3.208
1000000 points ---> π = 3.142564
읽어주셔서 감사합니다 ❤.
Reference
이 문제에 관하여(C#에서 몬테카를로 방법을 사용하여 π(PI)를 계산하는 방법.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/mohamadhag/how-to-calculate-pi-using-monte-carlo-method-with-c-1bd9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using System;
namespace Test
{
internal class Point
{
private double X { get; set; }
private double Y { get; set; }
public Point(double x, double y)
{
X = x;
Y = y;
}
public double GetX()
{
return X;
}
public double GetY()
{
return Y;
}
}
}
using System;
namespace Test
{
class Program
{
private static int NumberOfCirclePoints = 0;
private static Random RandomObject = new Random();
private static double GenerateRandomDouble(double min, double max)
{
double d = RandomObject.NextDouble() * (max - min) + min;
return d;
}
static void Main(string[] args)
{
Console.Write("Radius: ");
double radius = Convert.ToDouble(Console.ReadLine());
Console.Write("Center of the circle (eg. 10,2): ");
string center = Console.ReadLine();
Console.Write("How many points? ");
int numberOfPoints = Convert.ToInt32(Console.ReadLine());
string[] centerCoordinates = center.Split(',');
double cx = Convert.ToDouble(centerCoordinates[0].Trim());
double cy = Convert.ToDouble(centerCoordinates[1].Trim());
double scx, scy;
scx = scy = cx + radius;
for (int i = 0; i < numberOfPoints; i++)
{
double cxDouble = GenerateRandomDouble(cx, scx);
double cyDouble = GenerateRandomDouble(cy, scy);
// calculate the distance between the circle center and the given point.
double distance = Math.Sqrt(Math.Pow(cxDouble - cx, 2) + Math.Pow(cyDouble - cy, 2));
// If the distance is less or equal to the radius of the circle then the given point is inside the circle area.
// Else the given point is outisde the circle area.
if (distance <= radius)
NumberOfCirclePoints++;
}
double PI = 4 * (Convert.ToDouble(NumberOfCirclePoints) / Convert.ToDouble(numberOfPoints));
Console.WriteLine($"PI = {PI}");
Console.ReadKey();
}
}
}
Note: the distance formula is: d = √(x2 - x1)^2 + (y2 - y1)^2
Example:
for the same radius (let's say 100) and center C(0, 0)
1000 points ---> π = 3.208
1000000 points ---> π = 3.142564
Reference
이 문제에 관하여(C#에서 몬테카를로 방법을 사용하여 π(PI)를 계산하는 방법.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mohamadhag/how-to-calculate-pi-using-monte-carlo-method-with-c-1bd9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)