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


읽어주셔서 감사합니다 ❤.

좋은 웹페이지 즐겨찾기