티스토리 뷰

https://m.blog.naver.com/PostView.nhn?blogId=rkdwnsdud555&logNo=220828040636&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

 

 

 

def monte(repeat=1000000, radius=1000):
    area_circle = radius ** 2
    in_circle = 0
    count = 0
    import random
    import timeit
    while True:
        start = timeit.default_timer()
        for _ in range(repeat):
            x, y = random.randrange(0, radius), random.randrange(0, radius)
            if x*x + y*y <= area_circle:
                in_circle += 1
        count += repeat
        end = timeit.default_timer()
        print(f"delay={round(end-start, 3)} in_circle={in_circle} count={count} pi={in_circle/count*4}")


monte()

 

이렇게 하면 근사값은 나오는데 오차가 있다. 물론 난수의 범위를 넓혀서 

좀 더 촘촘히 점을 찍으면 좀 더 정확해 지긴 하지만 역시 오차가 있다.

 

컴퓨터에서 발생하는 난수는 난수 알고리즘을 통하기 때문에 무한대에 가까운 난수를 발생시키면

일정한 패턴이 발생하기 때문이다.

 

def monte(precision=1000):
    import timeit
    start = timeit.default_timer()

    area_circle = precision**2
    in_circle = 0
    count = 0

    ys = tuple(y**2 for y in range(precision))
    xs = tuple(x**2 for x in range(precision))
    for i, y in enumerate(ys):
        for x in xs:
            if x+y <= area_circle:
                in_circle += 1
            count += 1
        print(f"{round(i / len(ys) * 100, 5)}%")

    end = timeit.default_timer()
    print(f"in_circle={in_circle}, count={count}, pi={in_circle / count * 4}, precision={precision}, delay={end-start}")


monte()

 

이렇게 전수 검사를 하면 그런 문제가 해결되나 이것은 몬테 카를로가 아니라 더 많은 컴퓨팅 파워가 필요하다.

'python lecture > algorism' 카테고리의 다른 글

[edu] 올바른 괄호  (0) 2019.01.17
[edu] 행렬의 곱셈  (0) 2018.12.21
[edu] 퀵 소트  (0) 2018.12.19
[edu] 10진수 > n진수 변환  (0) 2018.12.19
[edu] queue (with node)  (0) 2018.12.11
댓글