Python random.choice() 函数 - 如何避免连续或相近的选择
假设我有
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
最简单的解决办法可能就是创建一个长度为 k
的 usedQueue
(这里的 k 是指在允许选择重复之前的选择次数)。当你选择一个选项时,就把它从原来的列表中移除,并放到 usedQueue
里。然后,如果 usedQueue.length > k
,就把一个选项放回到你的原始数组中。
正如之前提到的,这样做会大大减少你算法的随机性。不过,这种方法在实际应用中还是有用的(比如看看 iTunes 的做法)。