Welcome back to another Python snippet post. This week we're going to be looking at generating a collection of random numbers using the random module.
There are two functions that we're going to be concerned with in the random module: choices
and sample
. They're very similar to each other, but there are few differences that we're going to talk about in a moment.
random.sample
Let's start with the sample
function. sample
takes a population as its first argument, which must be a sequence or a set. This population is where the random values will come from. The second argument is called k
, and this value determines the number of items to select from the population.
import random
random_numbers = random.sample(range(10), k=3)
Here random_numbers
will be a list object containing three unique integers from 0 to 9.
Note that a range
is a valid population
, because a range
object is an immutable sequence type.
I mentioned just now that we will get unique integers back from sample
. This is because sample
will only select an item from the population
once. However, if the population
contains duplicate values, it's possible to get duplicate values in our resulting list.
Because every item can only be chosen once, if we provide a k
value that is larger than the length of the population
, we get a ValueError
.
random.choices
The choices
function works very much the same way. We start with a population
, and choices
also accepts a k
value as an argument, which determines how many values end up in the resulting collection.
import random
random_numbers = random.choices(range(10), k=3)
The difference between sample
and choices
is that choices
can pick the same value multiple times from the population
. This also means we can request a number of values that exceeds the length of the population, and we won't get a ValueError
. We'll just guarantee that a duplicate item ends up in the resulting list.
However, an empty population will result in an IndexError
.
In addition to a population
and a k
value, we can provide a relative weight for each value, changing the likelihood of that value ending up in the resulting list. We can do this by providing an argument for the weights
parameter, which must be a sequence.
import random
random_numbers = random.choices(range(5), weights=[10, 10, 20, 10, 10], k=3)
In this case, the value 2
is twice as likely as any other value to be chosen.
If we provide a weights
sequence of a different length to the population
, we get a TypeError
.
Wrapping up
That's it for this week! I hope you learnt something new about generating random collections in Python using the random module. While these examples focused on numbers, the populations can be whatever you want, and I'd encourage you to experiment!
If you liked this post, we'd appreciate it if you could share it with your friends, and you might want to follow us on Twitter to keep up with all out content.
If you're just starting out with Python, or you just want to upgrade your Python skills, you might also be interested in out Complete Python Course. Hope to see you there!