1

我尝试不断地随机显示 5 个可能的项目之一(大约 100 次),但重要的是不允许在一个之后立即显示相同的项目。两者之间需要(至少)总是有一个其他项目。

任何想法?

非常感谢

4

5 回答 5

1

请参阅下面的示例代码。

 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)
于 2013-08-29T15:49:27.140 回答
0

在 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]]为更有效的东西。

于 2013-08-29T16:01:03.737 回答
0

记住上一个项目并继续选择一个新的选择,直到它不同:

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)
于 2013-08-29T15:40:10.757 回答
0

是的。很多。

  • 确定迭代的次数。
  • 启动随机数生成器。
  • 将变量设置previousNone或类似。
  • 开始迭代。
  • 生成下一个随机数并与 比较previous。如果相同,请跳过它。
于 2013-08-29T15:41:08.477 回答
0

我会去:

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))
于 2013-08-29T15:46:08.523 回答