One of the most common tasks that requires random action is selecting one item from a group, be it a character from a string, unicode, or buffer, a byte from a bytearray, or an item from a list, tuple, or xrange. It’s also common to want a sample of more than one item.
A naive approach to these tasks involves something like the following; to select a single item, you would use randrange (or randint) from the random module, which generates a pseudo-random integer from the range indicated by its arguments:
import random
items = ['here', 'are', 'some', 'strings', 'of',
'which', 'we', 'will', 'select', 'one']
rand_item = items[random.randrange(len(items))]
An equally naive way to select multiple items might use random.randrange to generate indexes inside a list comprehension, as in:
rand_items = [items[random.randrange(len(items))]
for item in range(4)]
These work, but as you should expect if you’ve been writing Python for any length of time, there’s a built-in way of doing it that is briefer and more readable.
The pythonic way to select a single item from a Python sequence type — that’s any of str, unicode, list, tuple, bytearray, buffer, xrange — is to use random.choice. For example, the last line of our single-item selection would be:
rand_item = random.choice(items)
Much simpler, isn’t it? There’s an equally simple way to select n items from the sequence:
rand_items = random.sample(items, n)
If the sequence contains duplicate values, each one is an independent candidate for selection. If you want to avoid duplicates, random.choice and random.sample can also operate on sets; simply create a set from your sequence using set(items) and proceed as above.