1

私は常に 5 つの可能な項目のうちの 1 つをランダムに (100 回程度) 表示するようにしていますが、重要なことは、同じ項目が次々に表示されることは許可されていないということです。その間に (少なくとも) 常に 1 つの他のアイテムが必要です。

何か案が?

どうもありがとう

4

5 に答える 5

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 に答える
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 に答える