Моделирование Пи с использованием Монте-Карло

Этот код оценивает значение пи, а затем сравнивает его с реальным значением пи с определенной точностью, которая определяется как «с». Затем он уменьшает «c» до меньшего числа и снова выполняет расчет.

Значения c равны .01,0.001,0.0001,0.00001.

Я пытаюсь выполнить весь процесс 10 раз и найти среднее значение для количества 'd', которое соответствует количеству запусков кода, чтобы достичь желаемого уровня точности.

import math
import random
pi = math.pi

n = 0
d = 0
ratios = []
xs = []
ys = []
c = 0.1
simulating = True

while c >= 0.0001:

    while simulating:
        x=random.random()
        y=random.random()
        xs.append(x)
        ys.append(y)
        if x**2 + y**2 <= 1.0:
            n += 1
        d += 1
        ratio = 4*n*1./d
        ratios.append(ratio)
        if abs(ratio-pi) / pi <= c:
            print "Draws Needed: ", d
            break

    c = c*.1
    print c       

person user87566    schedule 06.10.2013    source источник
comment
Не могли бы вы сократить объем вашего вопроса? Мы будем рады вам помочь.   -  person Alexander Ventura    schedule 06.10.2013
comment
Какой у Вас вопрос? Я пытался понять это в течение 5 минут.   -  person Groditz    schedule 06.10.2013
comment
Что ж, никто не может понять, о чем вы спрашиваете, но я могу подтвердить, что это достойный подход к оценке числа Пи с помощью метода Монте-Карло.   -  person Tim Peters    schedule 06.10.2013
comment
В вашем коде есть несколько проблем. Исправленный приведен ниже.   -  person Developer    schedule 06.10.2013
comment
См. предыдущий вопрос о вычислении pi стиля Монте-Карло, он показывает некоторые недостатки этого метода.   -  person Bas Swinckels    schedule 13.10.2013


Ответы (1)


Вот наши исправления:

from __future__ import division
import random

pi = random._pi
error = 0.1
inCircle, Total = 0,0
while (error >= 0.0001):
    print '%g ...'%error
    while True:
        x,y = random.random(), random.random()
        if (0.5-x)**2+(0.5-y)**2 <= 0.25: inCircle += 1
        Total += 1
        estimate = 4*inCircle/Total
        if abs(estimate/pi-1) <= error:
            print '{est.} %g vs. {pi} %g after %d trials, {err} %g\n'%( \
                   estimate,pi,Total,error)
            break
    error *= 0.1

результаты:

0.1 ...
{est.} 3.33333 vs. {pi} 3.14159 after 6 trials, {err} 0.1

0.01 ...
{est.} 3.11765 vs. {pi} 3.14159 after 68 trials, {err} 0.01

0.001 ...
{est.} 3.14286 vs. {pi} 3.14159 after 70 trials, {err} 0.001

0.0001 ...
{est.} 3.1417 vs. {pi} 3.14159 after 247 trials, {err} 0.0001
person Developer    schedule 06.10.2013
comment
Некоторое объяснение могло бы помочь относительно того, что вы делаете и почему, иначе вы могли бы получить код в вашем сне божественной силой. - person Abhijit Sarkar; 04.03.2019