Функция Python random.choice() — как никогда не иметь двух вариантов подряд или близко друг к другу

#python #random #module

#python #Случайный #модуль

Вопрос:

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

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

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

Комментарии:

1. Выбор по любому правилу является полной противоположностью случайному выбору.

2. Вы пытаетесь получить случайные варианты выбора без замены? В этом случае вы можете просто удалять значения из списка по мере их появления

Ответ №1:

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

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

Ответ №2:

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

 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
  

Ответ №3:

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

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

Комментарии:

1. Это не делает того, что вы намеревались это сделать… Pop не удаляет это значение ; он удаляет этот индекс … Я думаю, вы имели в виду написать «удалить», который имеет (неочевидный) недостаток, заключающийся в том, что он выполняется в O (N) наихудшем случае.