#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) наихудшем случае.