확률적으로 원주율π를 추정했다

5753 단어 Python몬테카로법
파이톤의 표준 라이브러리인 random을 사용해 확률적으로 (엄밀히 말하면 몬테카로법으로) 원주율을 추산해 봤다고 한다.
(읽기 예상 시간: 4분)

생각


xy 좌표를 생각해 주세요.

여기서 원점 O를 중심으로 반지름 r의 원(C로 설정)과 모서리 길이가 2r인 사각형(S로 설정)을 그립니다.

S에서는 랜덤 타점(dot)을 날렸다.

S에서 빈 점을 찍을 때 "S에서 어떤 점의 수량: C에서 어떤 점의 수량≈S의 면적: C의 면적"이라고 할 수 있다.

S의 점 수는 "s dot num", C의 점 수는 "c dot num"으로 설정합니다.
(c_dot_num)/(s_dot_num)
=C 면적/S 면적
= (π*r의 제곱)/(2r)의 제곱
 = π/4
그러므로
π = 4 * (c_dot_num)/(s_dot_num)
라는 정의를 내렸다.
그리고dot_num 및 sdot_num을 각각 구할 수 있다면π의 값을 추측할 수 있다.
(r의 값은 상관이 없는 것 같다)

코드


이번에는 파이톤으로 썼어요.
estimate_pi.py
# 一辺の長さが1の正方形内にランダムにドットを打ち、円周率を推定する。
import random

def estimate_pi(n):
    c_dot_num = 0
    s_dot_num = 0
    for _ in range(n):
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        distance = x**2 + y**2
        if distance <= 1:
            c_dot_num += 1
        s_dot_num += 1
    pi = 4 * c_dot_num / s_dot_num
    return pi

if __name__ == '__main__':
    print('dotが100個のとき、円周率は{}'.format(estimate_pi(100)))
    print('dotが1000個のとき、円周率は{}'.format(estimate_pi(1000)))
    print('dotが10000個のとき、円周率は{}'.format(estimate_pi(10000)))
    print('dotが100000個のとき、円周率は{}'.format(estimate_pi(100000)))
※ 이미지

실행 결과


처음

두번째

세번째

대략 3.141 전후입니다.
시험 횟수 n(=dot의 타수)이 증가함에 따라 정밀도도 높아졌다.

총결산


이번에 우리는 랜덤수로 원주율을 추산한다.
학술적으로 무작위 수로 어떤 값을 평가하는 방법을'몬테카로법'이라고 부른다.
코드 자체가 어렵지는 않지만, 처음 알았을 때 "이런 방법이 있나!"감정이 고조돼서 비망록으로

좋은 웹페이지 즐겨찾기