로봇・기술/확률・통계

확률로 원주율 계산하기 (몬테 카를로법)

초인로크 2013. 5. 19. 15:14
반응형

몬테카를로 법(Monte Carlo method)이란, 컴퓨터 프로그래밍상으로 수치계산을 이용하는 대신 확률을 계산 함으로써 문제를 푸는 방법이다.


여기서는 확률을 이용하여서 원주율을 계산하는 방법을 복습삼아 정리한다.


・아래와 같이 각 변의 길이가 1인 정 사각형 안에 반지름이 1인 부채꼴이 들어가 있다고 생각한다.

사각형 안에 점을 랜덤하게 찍을 경우에 부채꼴 안에 들어가게 될 확률은 π/4(부채꼴의 면적)가 된다.

부채꼴의 면적과 사각형의 면적을 따져서 점이 들어갈 비율은 아래와 같다.


 π/4 : 1 = count : total_count 

count : 원안에 들어간 점의 수 

total_count : 전채 점의 수 


위 식을 정리해 보면 아래와 같이 나온다.

π= 4 × count / total_count

사람손으로는 몇천번 몇만번 계산하는게 힘들겠지만, 컴퓨터로는 1분도 안걸리기에 원주율을 구해 낼 수 있는 것이다.

100회           = 3.36

10000회       = 3.1448

1000000회   = 3.142916

...


대략 100000000번 정도 계산해 보니까 Pi :3.141543 라는 근사값이 나온다. (Xcode에서 프로그래밍한 수치)

난수를 사용한거라 그때그때 달라진다...


여기서부터는 소스코드 공개.

직접 작성해서 확인해 본 코드이므로 오류는 없을듯한데,

좀더 깔끔하게 코드를 짤 수 있는 사람은 변형해서 사용하면 좋을듯...



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
double rnd() {
    //랜덤치 설정: 0~1사이의 난수 
    return((double)(rand()%RAND_MAX)/(double)RAND_MAX);
}
 
int main(int argc, const char * argv[])
{
    int i,Total_count=100000000;
    //Total_count수치는 각자 맘대로 설정가능
    double PI,x,y,count,co=0;
    srand(time(NULL));
    //매번 난수표를 초기화 시킨다.
  
    for(i=0;i<Total_count;i++){
        x=rnd();
        y=rnd();
        //(x,y)좌표를 랜덤하게 결정한다.
 
        co=(x*x)+(y*y);
        //부채꼴 안에 들어온 점인지 계산한다.
        
        if(co <= 1){
            //부채꼴안에 들어온 점이면 if 안의 식이 계산된다.
            count++;
            PI=4*(count/Total_count);
        }
    }
 
    //파이값의 출력, 몇번만에 계산된 값인지도 i값을 이용해 출력했다.
    printf("count NO:%d Pi :%lf\n",i,PI);
}



반응형