我尝试不断地随机显示 5 个可能的项目之一(大约 100 次),但重要的是不允许在一个之后立即显示相同的项目。两者之间需要(至少)总是有一个其他项目。
任何想法?
非常感谢
请参阅下面的示例代码。
import random
import sys
def special_select(d, num_to_show=100):
selected = None
for i in range(num_to_show):
selected = random.choice(list(d.difference([selected])))
print selected
您可以尝试如下功能。
>> d = set(range(5))
>> special_select(d)
在 Python 中不是最有效的,但这里所做的是:当追加下一项时,下一项从池中采样,不包括前一项。
def rand_chain(n, chos_from):
rd_ls=[]
rd_ls.append(random.choice(chos_from))
for i in range(n-1):
rd_ls.append(random.choice([v for v in chos_from if v!=rd_ls[i]]))
return rd_ls
>>> rand_chain(10, range(10))
[8, 2, 9, 2, 9, 5, 9, 8, 2, 4]
如果您使用numpy
,请替换[v for v in chos_from if v!=rd_ls[i]]
为更有效的东西。
记住上一个项目并继续选择一个新的选择,直到它不同:
import random
def pick_random(options):
last = next = None
while True:
while next == last:
next = random.choice(options)
yield next
last = next
将其用作生成器:
>>> options = (1, 2, 3, 4, 5)
>>> picks = pick_random(options)
>>> for i in range(100):
... print(next(picks))
...
1
5
4
3
2
3
(...)
3
4
5
使用itertools.islice()
使得只选择 100 变得更容易:
from itertools import islice
for pick in islice(pick_random(options), 100):
print(pick)
是的。很多。
previous
为None
或类似。previous
。如果相同,请跳过它。我会去:
from itertools import groupby, islice
from random import choice
choices = range(5)
items = (k for k, g in groupby(iter(lambda: choice(choices), None)))
for item in islice(items, 100):
print item
这可以itertools.groupby
处理连续的重复值,islice
意味着你可以略过一些,所以如果你想要其中的 50 个,只需使用:
random50 = list(islice(items, 50))