<p>我觉得你的问题有点让人困惑,但听起来像个有趣的难题。你知道吗</p>
<p>为了重新解释你的问题,我假设你:</p>
<ul>
<li>必须主持一个谋杀神秘派对,并且要为每个参与者生成目标</li>
<li>希望每个与会者都有一对他们可能谋杀的不同的人</li>
<li>希望每个与会者都有一个他们不会谋杀的人</li>
</ul>
<p>您希望自动生成这些。你知道吗</p>
<p>我不确定这是否符合您的要求,但我是通过创建一个结构来实现的,该结构将从其内部集随机选择一个项,从其内部集移除该项并返回该项(即,它会以破坏性方式进行自身变异)。你知道吗</p>
<pre><code>import random
class SelectsFrom:
def __init__(self, items):
self.items = items
def select_one(self, exclude=set()):
if not self.items:
raise Exception("No items remaining")
available = self.items - exclude
if not available:
raise Exception("No items after exclusions")
selected = random.sample(available, 1)[0]
# remove the selected item from our list
self.items = self.items - {selected}
return selected
</code></pre>
<p>然后,通过使用其中三个结构来管理三个独立的选择流。你知道吗</p>
<pre><code>names = ['Laure', 'Greg', 'Lashon', 'Allan', 'Saturnina',
'Ruthie', 'Deedra', 'Shawana', 'Kathrin', 'Luna',
'Sandie', 'Waylon', 'Virgilio', 'Karisa', 'Yvette',
'Lamar', 'Brett', 'Delicia', 'Charles', 'Jeromy',
'Eugenie', 'Lawanna'] # from http://listofrandomnames.com
while True:
character_choices = []
try:
# Choose first murder target for character,
# excluding own character from choices
firstMurder = SelectsFrom(set(range(22)))
# Choose second murder target for character,
# excluding own character AND the first murder choice
secondMurder = SelectsFrom(set(range(22)))
# Choose a friend,
# excluding own character AND the both murder choices
wontMurder = SelectsFrom(set(range(22)))
for i in range(22):
first = firstMurder.select_one({i})
second = secondMurder.select_one({i, first})
friend = wontMurder.select_one({i,first,second})
character_choices.append([i, first, second, friend])
break
except Exception as e:
print("UNABLE TO FIND MATCHES, Starting again\n")
character_choices = [] # Reset the choices we have found
# Print the successful choices
for (i, first, second, friend) in character_choices:
print("Character [{}] will murder [{} or {}] but not [{}]".format(
names[i], names[first], names[second], names[friend]))
</code></pre>
<p>它产生如下输出(添加风味的名称):</p>
<pre><code>Character [Laure] will murder [Shawana or Virgilio] but not [Brett]
Character [Greg] will murder [Karisa or Waylon] but not [Saturnina]
Character [Lashon] will murder [Yvette or Lawanna] but not [Virgilio]
Character [Allan] will murder [Sandie or Eugenie] but not [Laure]
Character [Saturnina] will murder [Luna or Deedra] but not [Greg]
Character [Ruthie] will murder [Jeromy or Lashon] but not [Lamar]
Character [Deedra] will murder [Charles or Greg] but not [Allan]
Character [Shawana] will murder [Laure or Luna] but not [Waylon]
Character [Kathrin] will murder [Lawanna or Saturnina] but not [Luna]
Character [Luna] will murder [Delicia or Brett] but not [Jeromy]
Character [Sandie] will murder [Saturnina or Allan] but not [Kathrin]
Character [Waylon] will murder [Lashon or Kathrin] but not [Eugenie]
Character [Virgilio] will murder [Ruthie or Charles] but not [Sandie]
Character [Karisa] will murder [Kathrin or Delicia] but not [Yvette]
Character [Yvette] will murder [Lamar or Karisa] but not [Shawana]
Character [Lamar] will murder [Waylon or Shawana] but not [Ruthie]
Character [Brett] will murder [Allan or Yvette] but not [Lawanna]
Character [Delicia] will murder [Greg or Lamar] but not [Charles]
Character [Charles] will murder [Brett or Laure] but not [Lashon]
Character [Jeromy] will murder [Virgilio or Ruthie] but not [Delicia]
Character [Eugenie] will murder [Deedra or Jeromy] but not [Karisa]
Character [Lawanna] will murder [Eugenie or Sandie] but not [Deedra]
</code></pre>