Неожиданный вывод для атрибута класса - PullRequest
0 голосов
/ 30 ноября 2019

Я кодирую Интегратор Монте-Карло, и во время сегмента случайной выборки Интегратора в пределах def mc(self, n=1000) выбирается только одно случайное значение, и для каждой итерации это значение остается неизменным.

С моим кодированиемЯ ожидал, что он вызовет self.f из конструктора, который назначен функции f, который для целей тестирования я определил ниже как:

def function(x, y):
    f = x**2 + 4*y + 4
    return f

Интегратор был определен ниже как:

import random
random.seed(12345)
class Integrator():

    def __init__(self, f, x_min, x_max, y_min, y_max):
        self.f = f
        self.x_min = x_min
        self.x_max = x_max
        self.y_min = y_min
        self.y_max = y_max

    def mc(self, n=1000):
        integral = 0
        for i in range(n):
            x = random.uniform(self.x_min, self.x_max)
            y = random.uniform(self.x_min, self.y_max)
            self.f = f
            print(self.f)
            integral += self.f
        integral = (integral/n)*(self.x_max - self.x_min)*(self.y_max - self.y_min)
        print("The value of integral is: ", integral)

И вывод для self.f будет

0.10916233827396749
0.10916233827396749
0.10916233827396749
0.10916233827396749
0.10916233827396749

И так далее и так далее для всех операторов печати self.f для каждой итерации. При тестировании кода я использовал следующие значения / параметры:

x_min = -1
x_max = 1
y_min = -1
y_max = 1
x = random.uniform(x_min, x_max)
y = random.uniform(x_min, y_max)
f = function(x, y)
g = Integrator(f, x_min, x_max, y_min, y_max)
g.mc()

Извиняюсь за длинный вопрос, я хотел объяснить все подробно и предоставить все кусочки кода, которые, по моему мнению, будут иметь отношение к ответу на этот вопрос. вопрос (или вам повторить то, что я сделал, если хотите).

Короче говоря, почему self.f = f не генерирует новое значение f для каждой итерации, и как я могу изменитькод, чтобы сделать это так, что он делает? Кроме того, это задание, и я не могу сказать self.f = function(x, y), так как мой учитель передаст функцию с помощью переменной f.

...