Формирование случайных пар из списка (вроде ...)

Перейти к последнему редактированию

У меня есть список объектов объектов, и мне нужно соединить их случайным образом с помощью функции Randomize_Pairs , каждый Человек Объект имеет свойство цель того, кем они сочетаются.

Мои ограничения заключаются в том, что никто не может парить с собой (DUH), и они не должны быть в паре с одним и тем же человеком дважды.

Я получил эту работу, сделав временный список и выкрой людей, если ограничители были удовлетворены, но я уверен, что есть чистящий / лучший / более питонический способ сделать это. Кто-нибудь знает?


Редактировать

Я много использовал слово «пару» в этом вопросе, но это было неправильное слово. Это для игры, в которой каждый человек назначен другой человек в качестве цели, поэтому это односторонние отношения, где цель вашей цели не обязательно вы.

Цели будут изменены только в начале каждого раунда, так что все сразу.


Отредактируйте 2

Вот то, что я сейчас устроил , хотя он может быть улучшен, поэтому я оставляю открытый вопрос.

def randomize_targets(players):
    # get player count
    count = len(players)
    # copy the list of players
    available_targets = list(players)
    # shuffle the player order so if the last one has to have the same
    # target twice it's not always the same player
    players = list(players)
    random.shuffle(players)
    # loop over each player
    for player in players:
        # get the list of possible targets
        potential_targets = [target for target in available_targets \
                             if target != player \
                             and target != player.target]
        # try to pick one at random
        try:
            target = random.choice(potential_targets)
        # if we have to, use the same target as last time
        except IndexError:
            pass
        # remove the target from the available targets list
        available_targets.remove(target)
        # assign target
        player.target = target

Отредактируйте 3

Я определился с этим методом, даже если мне не нравится потенциально долгое время, пока не найдет комбинированное, которое работает, по крайней мере, оно всегда дает допустимые результаты

def randomize_targets2 (players):
    targets = list(players)
    # run this until it generates a valid result
    valid = False
    while not valid:
        # randomize the targets
        random.shuffle(targets)
        # validate them
        round_valid = True
        for player, target in zip(players, targets):
            round_valid = round_valid and player != target and player.target != target
        valid = round_valid

    # apply the validated targets
    for player, target in zip(players, targets):
        player.target = target
5
задан rennat 30 August 2011 в 19:28
поделиться