Python random.choice() 函数 - 如何避免连续或相近的选择

4 投票
3 回答
15009 浏览
提问于 2025-04-16 18:29

假设我有

mychoice = random.choice(['this is random response 1','this is random response 2', 
'this is random response 3', 'and 4', 'and so on'])

我该怎么做才能避免同样的选择连续出现多次?或者我怎么能设置一个条件,让某个特定的选择只有在选择了其他几个选项之后才出现?或者有没有更合适的模块可以满足我的需求?

3 个回答

0

这个程序会从我的列表中随机选择一些选项并打印出来,直到所有的选项都被用完为止。

index = range(len(mylist))
while len(index) > 0:
    i = random.choice(index)
    print mylist[i]
    index.pop(i)
2

下面是一个示例实现,确保同一个物品出现的两次之间有最小的距离:

def choice_gen(choices, min_dist):
    last_choices = collections.deque(maxlen=min_dist)
    choices = set(choices)
    while 1:
        c = random.choice(list(choices - set(last_choices)))
        last_choices.append(c)
        yield c
8

最简单的解决办法可能就是创建一个长度为 kusedQueue(这里的 k 是指在允许选择重复之前的选择次数)。当你选择一个选项时,就把它从原来的列表中移除,并放到 usedQueue 里。然后,如果 usedQueue.length > k,就把一个选项放回到你的原始数组中。

正如之前提到的,这样做会大大减少你算法的随机性。不过,这种方法在实际应用中还是有用的(比如看看 iTunes 的做法)。

撰写回答