随机数在计算机科学领域扮演着重要的角色,用于模拟真实世界的随机性、数据生成、密码学等多个领域。Python 中的 random 模块提供了丰富的随机数生成功能,本文整理了 random 模块的使用。
伪随机性:Python 使用 random 模块生成各种分布的伪随机数。计算机生成的随机数都是伪随机数,它们是由确定性算法生成的,只是看起来像随机。如果需要高度的随机性,需要额外的随机源。
不同类型的随机性:在模拟、密码学等场景中,需要注意不同类型的随机性需求。如果前往 Python 文档以获取此模块的文档,将会看到一条警告:
显然,random 模块只适用于一般的随机数需求。random 模块使用 Mersenne Twister 算法来生成随机数。但是这种算法是完全确定性的,而对于密码学等需要高强度随机性的场景,应该使用 secrets 模块。
下面是 random 模块下的各种内置函数。这些函数能够在不同场景下生成伪随机数:
函数名 | 描述 |
---|---|
randint(a, b) |
生成一个位于 [a, b] 范围内的随机整数 |
randrange(start, stop, step) |
生成一个以 step 递增的整数序列中的随机元素 |
random() |
生成一个位于 [0.0, 1.0) 范围内的随机浮点数 |
uniform(a, b) |
生成一个位于 [a, b) 范围内的随机浮点数 |
gauss(mu, sigma) |
生成一个符合高斯分布的随机浮点数,均值为 mu ,标准差为 sigma |
sample(population, k) |
从 population 序列中随机选择 k 个元素,不重复 |
choice(sequence) |
从序列中随机选择一个元素 |
shuffle(sequence) |
随机打乱序列中的元素顺序 |
seed(a=None) |
初始化随机数生成器的种子,用于重现随机序列 |
下面是这些函数的更详细介绍及示例。
此函数生成指定范围之间的整数。它接受两个参数 x x x 和 y y y 并生成整数 i i i,使得 x < = i < = y x <= i <= y x<=i<=y。
import random
a = random.randint(3, 6)
print(a) # 输出:3
该函数生成一个以 step
为步长的整数序列中的随机元素。start
和 stop
是范围,取值范围是 [start, stop)
。若省略 step
参数,默认为 1。
import random
a = random.randrange(1, 10, 2)
print(a) # 输出:7
该函数生成一个位于 [0.0, 1.0)
范围内的随机浮点数。所有数字在这个范围内的概率是相等的。
import random
a = random.random()
print(a) # 输出:0.6427979778735594
该函数生成一个位于 [a, b)
范围内的随机浮点数。类似于random()
,但可以指定范围。
import random
a = random.uniform(3, 6)
print(a) # 输出:3.512451152441262
该函数生成一个符合高斯分布(也称为正态分布)的随机浮点数。mu
是均值,sigma
是标准差,控制分布的形状。
import random
a = random.gauss(3, 0.5)
print(a) # 输出:2.9743970359818612
如果想要一个序列中的多个随机元素,可以使用 sample()
。它需要两个参数 population
和 k
,其中 population
是一个序列,k
是一个整数。然后,该函数从 population
序列中随机选择 k
个元素,并以列表形式返回。选择不重复。
import random
seq = (12, 33, 67, 55, 78, 90, 34, 67, 88)
a = random.sample(seq, 5)
print(a) # 输出:[88, 78, 67, 34, 33]
如果要从特定序列中选择随机元素,可以使用此函数。它需要一个参数——sequence
。它从序列中返回一个随机元素。
import random
seq = (12, 33, 67, 55, 78, 90, 34, 67, 88)
a = random.choice(seq)
print(a) # 输出:88
注意:
random.choice(seq)
不等同于random.sample(seq, 1)
,前者返回元素,后者返回列表。
此函数采用一个参数 —— 列表。然后,它会将列表的元素打乱并返回。
import random
a = [10, 20, 30, 40, 50]
random.shuffle(a)
print(a) # 输出:[30, 10, 20, 40, 50]
当需要多次生成相同的随机数序列时,可以使用此函数。它需要一个参数 —— 种子值。此值初始化伪随机数生成器。每当使用相同的种子值调用 seed()
函数时,它都会产生完全相同的随机数序列,这对于需要重现随机结果的情况很有用。
import random
# seed value = 3
random.seed(3)
for i in range(3):
print(random.random(), end = ' ')
print('\n')
# seed value = 8
random.seed(8)
for i in range(3):
print(random.random(), end = ' ')
print('\n')
# seed value again = 3
random.seed(3)
for i in range(3):
print(random.random(), end = ' ')
print('\n')
输出:
0.23796462709189137 0.5442292252959519 0.369955166548079250.2267058593810488 0.9622950358343828 0.12633089865085956
0.23796462709189137 0.5442292252959519 0.36995516654807925
可以看出,对于种子 = 3,每次都会生成相同的序列。