通过迭代确保随机生成的对不相同

2024-05-23 14:57:43 发布

您现在位置:Python中文网/ 问答频道 /正文

这里的目标是生成通过迭代保证唯一的随机配对(没有两个数字彼此匹配超过一次)。你知道吗

这是一个谋杀神秘派对,我每半年写一次,主持一次,我名单上的每个数字都会被一个字符名替换,然后与另一个字符匹配,随机生成另外两个字符,他们有谋杀动机,一个他们不会谋杀(因此三次迭代)。你知道吗

我不确定我在结尾的if语句是否真的起到了什么作用,尽管数字看起来还不错。这对我来说可能已经足够好了,但我正在努力学习。谢谢。你知道吗

import random

characters = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]#character list
print("list of all characters:")
print(characters)
print("")

i=1
while i <= 3: #loop three times
    random.shuffle(characters)#randomize list
    print("random character combinations", i, ":")
    for x in range(0,len(characters),2):
        pairing = [characters[x], characters[x+1]]
        print(pairing)
    i+=1
    if pairing == pairing: #ensure uniqueness? 
        continue

样本输出:

list of all characters:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]

random character combinations 1 :
[20, 2]
[15, 6]
[11, 18]
[22, 9]
[14, 8]
[12, 5]
[10, 16]
[7, 4]
[17, 21]
[19, 3]
[13, 1]
random character combinations 2 :
[6, 20]
[15, 17]
[19, 13]
[16, 14]
[21, 2]
[9, 10]
[7, 11]
[8, 4]
[18, 3]
[22, 5]
[12, 1]
random character combinations 3 :
[1, 2]
[13, 5]
[12, 18]
[9, 14]
[22, 3]
[7, 8]
[19, 4]
[10, 21]
[11, 15]
[6, 20]
[17, 16]

Tags: of目标if数字randomall字符list
2条回答

要生成随机唯一对,可以执行以下操作:

from itertools import combinations
import random

j =[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
k = list(combinations(j, 2))
random.shuffle(k)

k是231对的列表。你知道吗

我觉得你的问题有点让人困惑,但听起来像个有趣的难题。你知道吗

为了重新解释你的问题,我假设你:

  • 必须主持一个谋杀神秘派对,并且要为每个参与者生成目标
  • 希望每个与会者都有一对他们可能谋杀的不同的人
  • 希望每个与会者都有一个他们不会谋杀的人

您希望自动生成这些。你知道吗

我不确定这是否符合您的要求,但我是通过创建一个结构来实现的,该结构将从其内部集随机选择一个项,从其内部集移除该项并返回该项(即,它会以破坏性方式进行自身变异)。你知道吗

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

然后,通过使用其中三个结构来管理三个独立的选择流。你知道吗

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]))

它产生如下输出(添加风味的名称):

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]

相关问题 更多 >