본문 바로가기

네이버 캐스트로 살펴보는 SW

쉽게 배우는 소프트웨어 알고리즘

몬테카를로 방법으로 원주율 구하기

발행
발행
발행일
2015.05.27
조회수
10626

몬테카를로 방법으로 원주율 구하기 수학으로 만나는 소프트웨어

소프트웨어를 이용하면 원주율을 간단하게 구해볼 수 있다.

오늘날 우리는 소프트웨어와 함께 살아가고 있다. 공업용 로봇, 컴퓨터그래픽으로 합성한 영화, 비행기의 자동항법장치는 산업에서 쓰이고 있는 예이다. 신호등, 에어컨, 밥솥은 우리의 작은 일상생활까지 소프트웨어가 쓰이고 있음을 보여준다. 소프트웨어는 학문 분야에서도 매우 중요하게 쓰이고 있다. 특히 수학의 개념으로 생물학, 물리학, 공학과 같이 다른 학문의 문제를 해결하는 응용수학에서는 소프트웨어가 핵심적인 역할을 한다. 응용수학자들은 문제를 해결하기 위해 가상의 실험환경을 소프트웨어로 만들고, 수치를 입력하여 결과를 얻어 문제를 해결한다. 이런 과정을 시뮬레이션이라고 한다. 이 글에서는 소프트웨어로 원주율을 구해보는 시뮬레이션을 제작하여 소프트웨어가 수학에 어떻게 응용될 수 있는지 보여주고자 한다.

몬테카를로법 - 시뮬레이션을 만드는 방법

시뮬레이션은 현실과 유사한 환경을 만들고 모의실험을 통해 문제를 해석하고 해결하는 것을 말한다. 우리는 실제로 실험을 하기에 많은 시간과 비용, 위험과 어려움이 있을 때 시뮬레이션을 사용하여 문제를 해결한다. 이런 시뮬레이션을 만드는 대표적인 방법 중 하나가 ‘몬테카를로법(Monte Carlo method)’이다.

‘몬테카를로법(Monte Carlo method)’은 간단히 말해서 무작위 수(Random number)와 확률로 시뮬레이션을 설계하여 복잡한 문제의 해를 근사적으로 구하는 방법을 말한다. 이 방법은 폴란드계 미국인 수학자인 스타니스와프 울람(Stanislaw Ulam, 1909~1984)이 개발하였다. 예측하기 어려운 결과는 반복실험을 통해서 예상 확률을 알아낼 수 있다고 생각한 그는 ‘카드놀이에서 승률을 알아내는 방법 중 가장 좋은 방법은 게임을 여러 번 해 보는 것이고, 게임 횟수가 늘어날수록 추정은 더 정확해진다‘라고 믿었다. 그는 이런 생각을 근본으로 모나코의 유명한 도박도시인 몬테카를로(Monte Carlo)의 이름을 가져와 ’몬테카를로법‘을 만들었다. 이 글에서 원주율을 구하는 시뮬레이션을 만들 때 사용할 방법이 바로 이 몬테카를로법이다.

시뮬레이션을 통해 원주율을 구해보자

몬테카를로법으로 원주율을 구해보기 전에 먼저 원주율과 원주율을 구하기 위한 과거의 시도에 대해 알아보자. 원주율은 원의 지름의 길이에 대한 둘레의 비를 말한다. 그리스 문자 π로 표기하며 파이라고 읽는다. 원주율의 값은 3.14159265358979... 이지만, 순환하지 않는 무한소수이기 때문에 우리는 근삿값 3.14를 사용한다.

원주율을 구하려는 시도는 기원전 2000년 전부터 시작되었다. 고대 이집트에서는 바퀴를 굴려서 원주율을 측정했다. 그 때 계산했던 원주율은 약 3.1605이다.

고대 이집트 사람들은 바퀴를 굴려 원주율을 측정했다. 이집트 사람들의 방법을 보여주는 그림.

기원전 3세기 경에는 고대 그리스의 수학자 아르키메데스가 최초로 측정이 아닌 수학적 계산을 통해 원주율을 구하였다. 그는 원주의 길이는 원에 내접·외접하는 정다각형의 둘레의 길이 사이에 있다는 사실을 이용하여 정다각형의 변의 개수를 2배로 늘려가며 원주율을 구하였다. 이때 구한 원주율은 약 3.1418이다. 이후 16세기 독일의 수학자 루돌프는 아르키메데스의 원리를 이용하여 원주율의 값을 소수점 이하 35자리까지 정확하게 계산했다. 17세기에는 미적분학이 나오면서 원주율을 무한급수로 나타내는 식이 등장하게 되었다. 이로 인해 원주율은 소수점 100자리까지 구할 수 있게 되었다. 컴퓨터의 등장으로 오늘날은 원주율을 소수점 2조 자리까지 구할 수 있게 되었다. 원주율을 무한급수로 나타내는 방법은 계산자체는 어렵지 않지만, 왜 그런 수식으로 계산할 수 있는지 이해하기는 어렵다.

몬테카를로법을 이용해 원주율을 구하는 원리

이처럼 원주율을 구하기 위한 다양한 방법과 시도가 있었다. 그럼 이제 몬테카를로법을 이용하여 원주율을 구하는 방법에 대해 알아보자. 몬테카를로법을 이용하여 원주율을 구하는 원리는 아래와 같이 대단히 쉽다.

1) 한 변의 길이가 2r인 정사각형을 그리고 그 안에 꼭 맞는 원을 그린다. 이때 원의 반지름이 r이다.
2) 원의 넓이는 πr2 이며, 정사각형의 넓이는 4r2이다. 따라서 원의 넓이를 정사각형의 넓이로 나누면 π/4가 된다.
3) 정사각형 내부에 무작위로 점을 찍는다. 그리고 점이 원 안에 찍혔는지 밖에 찍혔는지 확인한다. 점과 중심과의 거리가 원의 반지름과 같거나 작으면 점은 원 안에 찍힌 것이다.
4) 찍은 점의 수가 많아질수록, 전체 점의 수와 원 안에 찍힌 점의 수의 비는 정사각형의 넓이와 원의 넓이의 비에 같아지게 된다. 즉, 찍은 점의 수가 많다면 아래 관계가 성립한다.

원의 넓이 / 정사각형의 넓이 = 원에 찍힌 점의 수 / 전체 찍힌 점의 수 = π /4
π = (원에 찍힌 점의 수 / 전체 찍힌 점의 수) x 4

원주율을 구하는 소프트웨어 제작

이 원리를 가지고 실제 소프트웨어를 만들어 시뮬레이션을 해 보자. 소프트웨어를 만들기 위해서는 먼저 알고리즘을 만들어야 한다. 알고리즘은 문제를 해결하는 방법을 순서대로 나열한 것을 말한다. 알고리즘의 표현법은 여러 가지가 있지만 그 중 일상언어로 표현을 하는 것이 가장 이해하기 쉽다. 원주율을 구하는 알로리즘을 일상언어로 표현하면 아래와 같다.

[원주율을 구하는 시뮬레이션 알고리즘]

1. 좌표 평면상에 (-100, 100), (100, 100), (100, -100), (-100, -100)을 꼭지점으로 하는 한변이 200인 정사각형을 그린다.
2. 그 안에 지름이 200인 원을 그린다.
3. 총 몇 개의 점을 찍을지 결정하고 ‘찍을 점의 수’에 기록한다.
4. 점이 정사각형 범위 안에 무작위로 찍히게 한다. (점은 정사각형의 범위인 X : -100~100 , Y : -100~100 사이에서 무작위로 나와야 한다.)
5. 점이 한번 찍힐 때 마다 ‘찍힌 점의 수’에 1씩 더한다.
6. 만약 찍힌 점의 위치와 원의 중심과의 거리가 100(원의 반지름)과 같거나 작으면 ‘원에 찍힌 점의 수’에 1씩 더한다.
7. 원주율을 (원에 찍힌 점의 수 / 찍힌 점의 수) X 4로 기록한다.
8. 4~6을 ‘찍을 점의 개수’만큼 반복한다.

이제 이 알고리즘을 프로그래밍 언어를 사용하여 소프트웨어로 만들어 보자. 프로그래밍 언어에는 C와 JAVA같은 텍스트형 전문언어와 엔트리와 스크래치 같은 교육용 프로그래밍 언어가 있다. 이 글에서는 쉽게 이해할 수 있는 교육용 프로그래밍 언어로 프로그래밍을 해보겠다. 결과는 아래와 같다.

원주율 시뮬레이션 알고리즘을 교육용 프로그래밍 언어로 짠 결과

이렇게 프로그래밍 언어로 만든 소프트웨어는 바로 직접 실행해 볼 수 있다. 실행 결과를 그림으로 나타내면 아래와 같다. 직접 실행해보고 싶다면, http://bit.ly/1FiRBw1로 방문하여 실행해볼 수 있다.

교육용 프로그래밍 언어로 만든 원주율 구하는 프로그램의 실행 결과. 결과 값은 실행 할 때 마다 약간 다를 수 있다.

단순한 방법으로 원주율을 구하는 소프트웨어의 힘

실행 결과를 보면 찍는 점의 수가 많아질수록 보다 정확한 원주율에 가까워지는 것을 확인할 수 있다. 이와 같이 확률과 난수를 이용한 몬테카를로법은 복잡한 계산식을 사용하지 않고, 쉽게 이해할 수 있는 원리로 해답을 찾는데 유용하다. 소프트웨어의 힘이다. 원주율을 몬테카를로법으로 구하는 다른 방법으로는 ‘뷔퐁의 바늘’ 등도 유명하다. 관심 있는 사람은 참고하기 바란다.

본 콘텐츠의 저작권은 저자 또는 제공처에 있으며, 이를 무단 이용하는 경우 저작권법 등에 따라 법적책임을 질 수 있습니다.

글 송상수Entry Korea 소프트웨어교육연구소 소장

소프트웨어 교육 전문가로 [초등학생 프로그래밍 첫걸음] 등의 책을 썼다. 현재 [Naver 소프트웨어야 놀자] 캠페인에 자문을 하고 있다.

인물정보 더보기
마이페이지에 담기