문제 15 · 실습 — 정 n각형 넓이로 π 근사
단위원에 내접한 정 n각형에 몬테-카를로 시뮬레이션으로 점을 던져 넓이를 추정하고, 그 값을 π의 근삿값으로 봅니다. srand(1)로 결과를 결정적으로 재현합니다. 예시 입력은 변의 수 180 입니다.
cpp
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n; // 정 n각형의 변의 수
const int N = 1000000; // 몬테카를로 표본 수
const double PI = acos(-1.0);
double apothem = cos(PI / n); // 단위원에 내접한 정 n각형의 변까지 거리
srand(1); // 결정적 재현
int inside = 0;
for (int t = 0; t < N; t++) {
double px = 2.0 * rand() / RAND_MAX - 1.0; // [-1, 1]
double py = 2.0 * rand() / RAND_MAX - 1.0; // [-1, 1]
bool in = true;
for (int i = 0; i < n; i++) {
double beta = (2 * i + 1) * PI / n; // 각 변의 바깥 방향
if (px * cos(beta) + py * sin(beta) > apothem) { in = false; break; }
}
if (in) inside++;
}
double area = 4.0 * inside / N; // [-1,1]^2 넓이 = 4
cout << "정 " << n << "각형 넓이(추정) = " << area << endl;
cout << "근사한 pi = " << area << endl;
return 0;
}입력 180에 대한 출력은 다음과 같습니다.
정 180각형 넓이(추정) = 3.14226
근사한 pi = 3.14226변의 수 n이 커질수록 정 n각형이 단위원에 가까워져 넓이가