Let's say I have
mychoice = random.choice(['this is random response 1','this is random response 2',
'this is random response 3', 'and 4', 'and so on'])
How can I avoid having the same choice being repeated more than once in a row? Or how can I can I set a condition to make a particular choice only appear after a certain number of other choices have been chosen? Or is there a module better suited to my needs in this regard?
the simplest solution would probably be to construct a usedQueue
of length k
(where k is the number of selections before a choice is allowed to repeat.) When you select a choice, remove it from your original list and place it in usedQueue
. Then, if usedQueue.length > k
, pop one back onto your array.
As already stated, this significantly reduces the randomness of your algorithm. That said, it does have practical uses (take a look at iTunes.)
Example implementation ensuring a minimum distance between two occurrences of the same item:
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
This routine selects and prints random choices from mylist without replacement, until all choices have been exhausted.
index = range(len(mylist))
while len(index) > 0:
i = random.choice(index)
print mylist[i]
index.pop(i)