Montecarlo Pi Оценочный код, возвращающий ноль - PullRequest
0 голосов
/ 20 апреля 2020

Не удается заставить этот код работать. Только когда-либо печатает 0.0. Я абсолютный новичок в python и знаю, что, вероятно, допустил очень простую ошибку и что мой код плохо написан.

import math
import random as ran
import numpy as np

nodarts=1000
nhits = 0




def isInTheCircle(nhits,nodarts):
    for i in range(nodarts):
          x = ran.uniform(-1,1) 
          y = ran.uniform(-1,1)
    if np.sqrt(x*x + y*y) >= 1:
        nhits += 1

isInTheCircle(nhits,nodarts)
pi = (4.0*nhits)/(nodarts)
print(pi)

1 Ответ

1 голос
/ 20 апреля 2020

Значение nhits никогда не меняется с нуля.

У вас есть определенная функция (isInTheCircle), и вы вызываете эту функцию, но она ничего не возвращает. Вам нужно переписать его, чтобы вернуть nhits и присвоить это значение переменной (предположительно также называемой nhits).

def isInTheCircle(nhits,nodarts):
    for i in range(nodarts):
          x = ran.uniform(-1,1) 
          y = ran.uniform(-1,1)
        if np.sqrt(x*x + y*y) <= 1:
            nhits += 1

    return nhits


nhits = isInTheCircle(nhits,nodarts)
pi = (4.0*nhits)/(nodarts)
print(pi)

Что может вас смущать, так это "область действия" переменной nhits. По сути, только потому, что у вас есть переменная с именем nhits внутри и снаружи функции, НЕ делает их одной и той же переменной. Переменная внутри функции изменяется, но переменная вне функции не обязательно изменяется (иногда это зависит от типа .... но это другая история). Прочтите «Переменная область действия в python», чтобы лучше понять это.

...