티스토리 뷰
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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- django
- GIT
- virtualenv
- 장고
- 장고 플러스친구 자동응답
- 면접답변
- pycrypto
- Python
- 파이썬 독학
- django chatbot
- 파이썬 입문
- gitlab
- 장고 카톡 자동응답
- 파이썬 강좌
- 문서 비교
- admin.py
- 엑셀 비교
- 파이썬 프로그래밍
- 파이썬
- 문과 코딩
- Tistory
- wsgi
- 모바일 스킨 적용
- chatbot
- PuTTYGen
- 모바일 테마 적용
- 면접정답
- gitignore
- 이미지 비교
- 플러스친구 자동응답
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함