Проблема с застежкой-молнией, когда бежит за петлей Монте Карло Сима;питон - PullRequest
0 голосов
/ 05 ноября 2011

Работа в Python 2.7.

Я уверен, что код немного громоздкий, но я постараюсь объяснить это так просто, как только смогу.

У меня есть два списка:

T = [[1,0], [1,0], [0,5]]
S = [[1], [3], [2]]

Мне нужно добавить соответствующее значение из B в конец соответствующего списка в T, поэтому, используя zip, я сложил их вместе.

Затем я вычисляю результат первого значения каждого списка, вычтенного из третьего, и добавляю это значение, используя другую функцию zip.

Поэтому, когда я запускаю свою функцию, переменная T теперь выглядит как [[1,0,1,0], [1,0,3, -2], [0,5,2, -2]].

Затем у меня есть ряд операторов if, которые, если определенные значения выше или ниже, чем другие, в списке возвращаются выигрыш, проигрыш или ничья.

Я хотел бы смоделировать результаты моей функции (starterTrans) несколько раз. Проблема в том, что когда я использую:

def MonteCarlo(T, S, x):
    for i in range(0, x):
        starterTrans(T, S)

Для каждой симуляции я получаю разные версии T. Так что в первый раз во время симуляции T в каждом списке (четыре) появляется соответствующее количество элементов (четыре), но после каждого прогона добавляется все больше и больше переменных. 1019 *

Мне нужен способ привязать T к исходным четырем переменным независимо от того, сколько раз я хочу его использовать. И я изо всех сил пытаюсь найти способ сделать это. Есть идеи?

Я знаю, что мой код запутан, но вот если он поможет кому-нибудь последовать моей попытке описать мою проблему:

def starterTrans(team, starter):
    wins = 0
    losses = 0
    nd = 0
    random.shuffle(team)
    for t, s in zip(team, starter):
        t.extend(s)
    score_add(team, exit_score(team, starter))
    length = len(starter)
    for i in range(0, length):
        if team[i][4] > 0 and (team[i][1] > -team[i][4]) and team[i][2] >= 5:
            wins += 1
        elif team[i][4] < 0 and (team[i][1] <= -team[i][4]):
            losses += 1
        elif (team[i][4] <= 0 and team[i][1] >= -team[i][4]):
            nd += 1
    return wins, losses, nd

def score_add(team, exit_scores):
    for t, e in zip(team, exit_scores):
        t.append(e)
    return team

def exit_score(team, starter):
    exit_scores = []
    length = len(starter)
    for i in range(0, length):
        score = team[i][0]-team[i][3]
        exit_scores.append(score)
    return exit_scores

def MonteCarlo(team, starter, x):
    for i in range(0, x):
        starterTrans(team, starter)

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

Я думаю, вам просто нужно изменить это:

def MonteCarlo(T, S, x):
    for i in range(0, x):
        starterTrans(T, S)

к этому:

def MonteCarlo(T, S, x):
    for i in range(0, x):
        starterTrans(T[:], S)

Это передаст копию T в starterTrans(..) вместо исходного списка. Если вы редактируете элементы T в starterTrans(..), это не поможет. Здесь вам понадобится глубокая копия. Посмотрите здесь разницу между мелкими и глубокими копиями: В чем разница между глубокой и мелкой копиями? .

0 голосов
/ 05 ноября 2011

Измените последнюю строку на starterTrans(team[:], starter).Это передается в копии team , оставляя оригинал без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...