Запуск функции несколько раз и печать результатов для каждого отдельного запуска
Привет, я относительно новичок и у меня проблемы с запуском симуляции Монте-Карло и распечаткой результатов:
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