문제

Monte Carlo를 사용하여 π를 찾기위한 많은 알고리즘을 시도했습니다. 솔루션 중 하나 (파이썬)는 다음과 같습니다.

def calc_PI():
    n_points = 1000000
    hits = 0

    for i in range(1, n_points):
        x, y = uniform(0.0, 1.0), uniform(0.0, 1.0)

        if (x**2 + y**2) <= 1.0:
            hits += 1

    print "Calc2: PI result", 4.0 * float(hits) / n_points

슬픈 부분은 1000000000을 사용하더라도 정밀도가 매우 나쁘다는 것입니다 (3.141...).

이것이이 방법이 제공 할 수있는 최대 정밀도입니까? 내가 Monte Carlo를 선택한 이유는 병렬 부분에서 파괴하기가 매우 쉽기 때문입니다. 조각으로 나누고 계산하기 쉬운 π에 대한 또 다른 알고리즘이 있습니까?

도움이 되었습니까?

해결책

이것은 Monte Carlo의 전형적인 예입니다. 그러나 PI의 계산을 병렬 부품으로 나누려는 경우 무한 시리즈를 사용하고 각 코어가 범위를 차지하게하지 않겠습니까? 그런 다음 결과를 합산합니까?

http://mathworld.wolfram.com/piformulas.html

다른 팁

분수 오류가지나갑니다 sqrt(N)/N = 1/sqrt(N), 이것은 정확한 추정치를 얻는 매우 비효율적 인 방법입니다. 이 한계는 측정의 통계적 특성에 의해 설정되며 이길 수 없습니다.

당신은 얻을 수 있어야합니다 floor(log_10(N))/2-1 정밀도의 숫자 N 던졌습니다. 아마도 -2 안전하기 위해 ...

그럼에도 불구하고 그것은 당신이 실제 RNG 또는 충분한 prng를 사용하고 있다고 가정합니다.

준 무작위 번호 생성기를 사용하십시오 (http://www.nag.co.uk/industryarticles/introduction_to_quasi_random_numbers.pdf) 표준 의사 rng 대신. 준 임의의 숫자는 의사 랜덤 숫자보다 더 고르게 통합 영역 (MC 통합입니다)을 다루고 더 나은 수렴을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top