Функция Python random.choice () - как никогда не иметь два варианта подряд или близко друг к другу - PullRequest
4 голосов
/ 28 мая 2011

Допустим, у меня есть

mychoice = random.choice(['this is random response 1','this is random response 2', 
'this is random response 3', 'and 4', 'and so on'])

Как я могу избежать повторения одного и того же выбора более одного раза подряд? Или как я могу установить условие, чтобы конкретный выбор отображался только после выбора определенного количества других вариантов? Или есть модуль, более подходящий для моих нужд в этом отношении?

Ответы [ 3 ]

8 голосов
/ 28 мая 2011

простейшим решением, вероятно, было бы создание usedQueue длины k (где k - количество выборов до того, как выбор может повториться.) Когда вы выбираете выбор, удалите его из исходного списка ипоместите это в usedQueue.Затем, если usedQueue.length > k, вставьте один обратно в ваш массив.

Как уже говорилось, это значительно уменьшает случайность вашего алгоритма.Тем не менее, он имеет практическое применение (взгляните на iTunes.)

2 голосов
/ 28 мая 2011

Пример реализации, обеспечивающий минимальное расстояние между двумя экземплярами одного и того же элемента:

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
0 голосов
/ 01 марта 2013

Эта процедура выбирает и печатает случайные варианты из списка mylist без замены, пока все варианты не будут исчерпаны.

index = range(len(mylist))
while len(index) > 0:
    i = random.choice(index)
    print mylist[i]
    index.pop(i)
...