Запуск функции несколько раз и печать результатов для каждого отдельного запуска

Привет, я относительно новичок и у меня проблемы с запуском симуляции Монте-Карло и распечаткой результатов:

import random
import math
def computePI(throws):
throws = 100
radius = 1
ontarget = 0
offtarget = 0
numthrows = 0
while throws < 10000000:
    while numthrows < throws:
        x = random.uniform(-1.0,1.0)
        y = random.uniform(-1.0,1.0)
        hyp = math.hypot(x,y)
        if hyp <= radius:
            ontarget += 1
            numthrows+=1
        else:
            offtarget += 1
            numthrows+=1
        continue
    pi = (ontarget/throws)*4
    throws *= 10
    return(pi)

def main ():
throws = 100
while throws <= 10000000:
    difference = computePI(throws) - math.pi
    print('{first} {last}'.format(first="Num =", last=throws),end = "    ")
    print('{first} {last}'.format(first="Calculated Pi =", last=computePI(throws)),end = "    ")
    if difference < 0:
        print('{first} {last}'.format(first="Difference =", last=round(difference,6)))


    if difference > 0:
        print('{first} +{last}'.format(first="Difference =", last=round(difference,6)))
    throws *= 10
 main()

Так что я думаю, что функция Монте-Карло (computePI) верна. Я пытаюсь запустить функцию Монте-Карло для значений 100, 1000, 100000, 1000000 и 10000000. Есть ли способ запускать функцию computePI каждый раз, когда цикл while в функции main() зацикливается?

1 ответ

Решение

Ваша проблема - пустое пространство:

1) Вам нужно сделать отступ для тела computePi, Если вы используете IDLE, это легко: выделите тело и используйте Ctrl + [

2) Вам нужно сделать отступ для тела main

3) Последний звонок main() внизу файла не должно быть пробела перед ним.

Я сделал эти изменения, и они работали, как и ожидалось (хотя приближения к пи были не особенно хорошими).

На редактирование: логика вашего computePi не совсем понятно. Попробуйте следующую версию:

def computePI(throws):
    radius = 1
    ontarget = 0
    offtarget = 0
    numthrows = 0
    for throw in range(throws):
        x = random.uniform(-1.0,1.0)
        y = random.uniform(-1.0,1.0)
        hyp = math.hypot(x,y)
        if hyp <= radius:
            ontarget += 1
            numthrows+=1
        else:
            offtarget += 1
            numthrows+=1
    pi = (ontarget/throws)*4
    return(pi)

def main ():
    throws = 100
    while throws <= 10000000:
        difference = computePI(throws) - math.pi
        print('{first} {last}'.format(first="Num =", last=throws),end = "    ")
        print('{first} {last}'.format(first="Calculated Pi =", last=computePI(throws)),end = "    ")
        if difference < 0:
            print('{first} {last}'.format(first="Difference =", last=round(difference,6)))


        if difference > 0:
            print('{first} +{last}'.format(first="Difference =", last=round(difference,6)))
        throws *= 10
main()

Код теперь дает довольно разумное приближение к пи:

Num = 100    Calculated Pi = 3.4    Difference = -0.141593
Num = 1000    Calculated Pi = 3.124    Difference = +0.082407
Num = 10000    Calculated Pi = 3.106    Difference = -0.001593
Num = 100000    Calculated Pi = 3.13428    Difference = +0.012247
Num = 1000000    Calculated Pi = 3.14062    Difference = -0.000737
Num = 10000000    Calculated Pi = 3.14187    Difference = +0.000475
Другие вопросы по тегам