Перейти к последнему редактированию
У меня есть список объектов
объектов, и мне нужно соединить их случайным образом с помощью функции Randomize_Pairs
, каждый Человек
Объект имеет свойство цель
того, кем они сочетаются.
Мои ограничения заключаются в том, что никто не может парить с собой (DUH), и они не должны быть в паре с одним и тем же человеком дважды.
Я получил эту работу, сделав временный список и выкрой людей, если ограничители были удовлетворены, но я уверен, что есть чистящий / лучший / более питонический способ сделать это. Кто-нибудь знает?
Я много использовал слово «пару» в этом вопросе, но это было неправильное слово. Это для игры, в которой каждый человек назначен другой человек в качестве цели, поэтому это односторонние отношения, где цель вашей цели не обязательно вы.
Цели будут изменены только в начале каждого раунда, так что все сразу.
Вот то, что я сейчас устроил , хотя он может быть улучшен, поэтому я оставляю открытый вопрос.
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
Я определился с этим методом, даже если мне не нравится потенциально долгое время, пока не найдет комбинированное, которое работает, по крайней мере, оно всегда дает допустимые результаты
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