Значение 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», чтобы лучше понять это.