私は常に 5 つの可能な項目のうちの 1 つをランダムに (100 回程度) 表示するようにしていますが、重要なことは、同じ項目が次々に表示されることは許可されていないということです。その間に (少なくとも) 常に 1 つの他のアイテムが必要です。
何か案が?
どうもありがとう
私は行きます:
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))
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
ます。同じ場合は飛ばしてください。