Python的random
库是用于生成随机数的标准库。它提供了各种功能,可以产生伪随机数、随机选择元素、打乱序列等。
import random
该模块实现了各种分布的伪随机数生成器。
对于整数,从范围中有统一的选择。 对于序列,存在随机元素的统一选择、用于生成列表的随机排列的函数、以及用于随机抽样而无需替换的函数。
在实数轴上,有计算均匀、正态(高斯)、对数正态、负指数、伽马和贝塔分布的函数。 为了生成角度分布,可以使用 von Mises 分布。
几乎所有模块函数都依赖于基本函数 random()
,它在左开右闭区间 0.0 <= X < 1.0
内均匀生成随机浮点数。 Python 使用 Mersenne Twister 作为核心生成器。 它产生 53 位精度的浮点数并且周期为 2**19937-1。 其在 C 中的这个底层实现既快速又线程安全。 Mersenne Twister 是目前经过最广泛测试的随机数生成器之一。 但是,因为是完全确定性的,它不适用于所有目的,并且完全不适用于加密目的。
警告:不应将此模块的伪随机生成器用于安全目的。
random.seed(a=None, version=2)
**初始化随机数生成器。**即,用于设置随机数生成器的种子。种子是一个用于初始化随机数生成器的整数或字节序列。通过设置相同的种子,可以确保每次运行程序时生成的随机数序列是相同的,从而实现可重复的随机性。
a
:种子值,可以是整数或字节序列。如果未提供种子值(即a=None
),则使用系统时间作为种子。
str
、 bytes
或 bytearray
对象转换为 int
并使用它的所有位。str
和 bytes
的算法生成更窄的种子范围。version
:指定随机数生成器的版本。默认值为2。random.seed(version=5)
random.getstate()
返回捕获生成器当前内部状态的对象。 这个对象可以传递给 setstate()
来恢复状态。
getstate()
函数没有参数,调用它将返回一个表示当前随机数生成器状态的元组。这个元组包含了生成随机数所需的所有信息,包括种子值、内部状态等。import random
# 获取当前随机数生成器的状态
state = random.getstate()
# 生成一些随机数
random_number1 = random.randint(1, 100)
random_number2 = random.random()
# 恢复随机数生成器的状态
random.setstate(state)
# 生成相同的随机数
restored_random_number1 = random.randint(1, 100)
restored_random_number2 = random.random()
# 打印结果
print(random_number1) # 随机数1
print(random_number2) # 随机数2
print(restored_random_number1) # 恢复后的随机数1,与random_number1相同
print(restored_random_number2) # 恢复后的随机数2,与random_number2相同
18
0.7057776752277172
18
0.7057776752277172
random.setstate(state)
state 应该是从之前调用 getstate()
获得的,并且 setstate()
将生成器的内部状态恢复到 getstate()
被调用时的状态。
random.randbytes(n)
生成 n 个随机字节。
此方法不可用于生成安全凭据。 那应当使用 secrets.token_bytes()
。
random.randbytes(3)
b’!i\xbf’
random.randrange(start, stop=None, step=1)
用于生成一个指定范围内的随机整数。
这大致等价于 choice(range(start, stop, step))
但是支持任意大的取值范围并针对常见场景进行了优化。
start
:生成随机整数的起始值(包含在范围内)。
# 生成 0 到 9 之间的随机整数
random.randrange(10)
5
stop
:生成随机整数的结束值(不包含在范围内)。如果未提供此参数,则默认为 None,此时生成的随机整数范围为 0 到 start
。
# 生成 1 到 10 之间的随机整数
random.randrange(1, 11)
8
step
:生成随机整数的步长,默认为 1。
# 生成 0 到 100 之间的偶数
random.randrange(0, 101, 2)
74
random.randint(a, b)
返回随机整数 N 满足 a <= N <= b
。相当于 randrange(a, b+1)
。
a
:生成随机整数的下界(包含在范围内)。b
:生成随机整数的上界(包含在范围内)。random.randint(1,5)
5
random.getrandbits(k, /)
用于生成一个具有 k 个随机比特位的非负 Python 整数。在 3.9 版本后,此方法现在接受零作为 k 的值。
random.getrandbits(8)
241
random.choice(seq)
从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError
。
seq
:表示一个序列,可以是列表、元组、字符串等可迭代对象。random.choice(
['apple', 'banana', 'orange', 'grape', 'kiwi']
)
‘apple’
random.choices(population, weights=None, *, cum_weights=None, k=1)
用于从给定的总体(population)中进行有放回地进行随机抽样,返回一个包含指定数量元素的列表。 如果 population 为空,则引发 IndexError
。
population
:表示总体,可以是一个可迭代对象(如列表、元组、字符串),或是一个整数 n,表示从范围 range(n)
中进行抽样。weights
(可选):表示每个元素的权重,可以是一个与 population
具有相同长度的可迭代对象,或是一个数字。默认情况下,所有元素的权重相等。cum_weights
(可选):与 weights
相同长度的累积权重列表,用于快速计算抽样结果。如果提供了 cum_weights
,则忽略 weights
参数。k
(可选):表示要进行抽样的元素数量,默认为 1。函数返回一个包含抽样结果的列表,列表的长度为 k
。
random.choices(
['apple', 'banana', 'orange', 'grape', 'kiwi'],
weights=[2, 3, 1, 4, 2],
k=3
)
[‘grape’, ‘banana’, ‘banana’]
random.shuffle(x, random=None)
就地将序列 x 随机打乱位置。
要改变一个不可变的序列并返回一个新的打乱列表,请使用 sample(x, k=len(x))
。
该函数有两个参数:
x
:表示要打乱顺序的序列,可以是一个可变序列(如列表)。random
(可选):表示一个可调用对象,用于生成随机数。如果未提供该参数,则使用默认的随机数生成器。函数会直接修改序列 x,将其中的元素随机打乱顺序,不返回任何结果。
random.shuffle(
[1, 2, 3, 4, 5]
)
[3, 5, 1, 4, 2]
random.sample(population, k, *, counts=None)
用于从给定的总体(population)中进行无放回地进行随机抽样,返回一个包含指定数量元素的列表。
该函数有以下参数:
population
:表示总体,可以是一个可迭代对象(如列表、元组、字符串),或是一个整数 n,表示从范围 range(n)
中进行抽样。k
:表示要进行抽样的元素数量。counts
(可选):一个整数或一个与 population
具有相同长度的可迭代对象,指定每个元素的数量。默认情况下,所有元素的数量为 1。函数返回一个包含抽样结果的列表,列表的长度为 k
。
random.sample(
['apple', 'banana', 'orange', 'grape', 'kiwi'],
k=3,
counts=[9, 1, 1, 1, 1]
)
[‘apple’, ‘apple’, ‘apple’]
重复的元素可以一个个地直接列出,或使用可选的仅限关键字形参 counts 来指定。 例如,sample(['red', 'blue'], counts=[4, 2], k=5)
等价于 sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
。
要从一系列整数中选择样本,请使用 range()
对象作为参数。 对于从大量人群中采样,这种方法特别快速且节省空间:sample(range(10000000), k=60)
。
如果样本大小大于总体大小,则引发 ValueError
。
在 3.9 版本发生变更: 增加了 counts 形参。
以下函数生成特定的实值分布。如常用数学实践中所使用的那样,函数形参以分布方程中的相应变量命名,大多数这些方程都可以在任何统计学教材中找到。
random.random()
用于生成一个位于 [0, 1) 范围内的随机浮点数。
该函数无需参数,每次调用都会返回一个位于 [0, 1) 范围内的随机浮点数。
random.random()
0.06843809869654183
每次调用 random.random()
都会返回一个不同的随机浮点数,该函数多用于需要生成随机概率或进行概率计算的场景中。
random.uniform(a, b)
返回一个位于指定范围 [a, b]
内的随机浮点数 N ,当 a <= b
时 a <= N <= b
,当 b < a
时 b <= N <= a
。
注意:当
a
和b
的值非常接近时,由于浮点数的精度限制,生成的随机数可能会包括或不包括b
这个终点值,具体取决于表达式a + (b - a) * random()
的浮点舍入结果。
random.uniform(9.9, 1)
7.6930341099128405
random.triangular(low=0.0, high=1.0, mode=None)
返回一个三角分布(triangular distribution)内的随机浮点数 N ,使得 low <= N <= high
并在这些边界之间使用指定的 mode 。 low 和 high 边界默认为零和一。mode 参数默认为边界之间的中点,给出对称分布。
low
:表示分布的下界。high
:表示分布的上界。mode
(可选):表示分布的峰值,即最可能出现的值。如果未提供该参数,默认值为中点 (low + high) / 2
。random.triangular(0.0, 1.0, 0.5)
0.28521446404960693
该函数多用于需要生成符合三角分布的随机数的场景中。
Beta 分布是一种连续概率分布,其形状由参数 alpha
和 beta
决定。它的取值范围在区间 [0, 1] 内。
random.betavariate(alpha, beta)
参数的条件是 alpha > 0
和 beta > 0
。 返回值的范围介于 0 和 1 之间。
alpha
:表示 Beta 分布的第一个形状参数(shape parameter)。beta
:表示 Beta 分布的第二个形状参数(shape parameter)。函数会基于给定的参数生成一个服从 Beta 分布的随机浮点数,并返回该随机数。
random.betavariate(2, 5)
0.14073565022070164
该函数多用于需要生成符合 Beta 分布的随机数的场景中,例如用于模拟随机概率或进行概率计算。
**指数分布是一种连续概率分布,常用于模拟表示随机事件之间时间间隔的随机变量。**它的概率密度函数(probability density function)为 lambd * exp(-lambd * x)
,其中 x
为随机变量的取值。
random.expovariate(lambd)
lambd 是 1.0 除以所需的平均值,它应该是非零的。 如果 lambd 为正,则返回值的范围为 0 到正无穷大;如果 lambd 为负,则返回值从负无穷大到 0。
lambd
:表示指数分布的参数,也称为率参数(rate parameter)或衰减参数(decay parameter)。它是一个正数,表示单位时间内事件发生的平均次数。(该参数本应命名为 “lambda” ,但这是 Python 中的保留字。)函数会基于给定的 lambd
参数生成一个服从指数分布的随机浮点数,并返回该随机数。
random.expovariate(0.5)
6.39915315576473
该函数多用于需要生成服从指数分布的随机数的场景中,例如在模拟排队、网络传输等随机事件的时间间隔。
**伽玛分布是一种连续概率分布,它的形状由参数 alpha 和尺度由参数 beta 决定。**它在实际应用中常用于建模正偏斜(right-skewed)的数据分布。
random.gammavariate(alpha, beta)
(不是 gamma 函数!) shape 和 scale 形参,即 alpha 和 beta,必须为正值。 (调用规范有变动并且有些源码会将 ‘beta’ 定义为逆向的 scale)。
概率分布函数是:
x ** (alpha - 1) * math.exp(-x / beta)
pdf(x) = --------------------------------------
math.gamma(alpha) * beta ** alpha
random.gammavariate(2, 3)
4.231543998685352
该函数多用于需要生成服从伽玛分布的随机数的场景中,例如在风险分析、可靠性工程、金融建模等领域。
高斯分布是一种连续概率分布,其形状呈钟形曲线,以均值为中心对称。大部分的数据点分布在均值附近,随着距离均值的增加,数据点的概率逐渐减小。
random.gauss(mu, sigma)
mu
:表示高斯分布的均值(mean)。sigma
:表示高斯分布的标准差(standard deviation)。函数会基于给定的参数生成一个服从高斯分布的随机浮点数,并返回该随机数。
random.gauss(0, 1)
1.3007577675850523
该函数多用于需要生成服从高斯分布的随机数的场景中,例如在统计建模、模拟实验、数据生成等方面。
注意:
random.gauss(mu, sigma)
函数**生成的是近似服从高斯分布的随机数,而不是完全的高斯分布。**如果需要更精确的高斯分布随机数生成,可以使用第三方库,如 NumPy。
对数正态分布是一种连续概率分布,它的形状呈右偏斜(right-skewed)的曲线。它的概率密度函数(probability density function)与正态分布的概率密度函数之间存在关联。
random.lognormvariate(mu, sigma)
mu
:表示对数正态分布的均值的自然对数(natural logarithm of the mean)。sigma
:表示对数正态分布的标准差。函数会基于给定的参数生成一个服从对数正态分布的随机浮点数,并返回该随机数。
random.lognormvariate(0, 1)
0.1754746230005146
该函数多用于需要生成服从对数正态分布的随机数的场景中,例如在金融领域、可靠性工程等方面。
注意:**生成的随机数是对数正态分布的变量,而不是对数值。**如果需要对数值,可以使用
math.exp()
函数将其指数化。
import random
import math
log = random.lognormvariate(0, 1) # 生成对数正态分布的随机数
exp = math.exp(log) # 将对数值指数化
print(log)
print(exp)
0.7737669840052342
2.167917401701035
正态分布是一种连续概率分布,其形状呈钟形曲线,以均值为中心对称。大部分的数据点分布在均值附近,随着距离均值的增加,数据点的概率逐渐减小。
random.normalvariate(mu, sigma)
mu
:表示正态分布的均值(mean)。sigma
:表示正态分布的标准差(standard deviation)。函数会基于给定的参数生成一个服从正态分布的随机浮点数,并返回该随机数。
random.normalvariate(0, 1)
-1.9032845189309575
该函数多用于需要生成服从正态分布的随机数的场景中,例如在统计建模、模拟实验、数据生成等方面。
random.normalvariate(mu, sigma)
函数**生成的是近似服从正态分布的随机数,而不是完全的正态分布。**如果需要更精确的正态分布随机数生成,可以使用第三方库,如 NumPy。
**von Mises 分布是一种连续概率分布,用于建模在圆周上的随机变量。**它通常用于表示方向性数据,如地理方向、天文方向等。von Mises 分布在统计学和概率论中具有重要的应用。
random.vonmisesvariate(mu, kappa)
mu
:表示 von Mises 分布的平均角度(mean angle)。kappa
:表示 von Mises 分布的集中度(concentration)。函数会基于给定的参数生成一个服从 von Mises 分布的随机浮点数,并返回该随机数。
random.vonmisesvariate(0, 1)
0.2585829251109295
**Pareto 分布是一种连续概率分布,它以帕累托原理(Pareto principle)命名。Pareto 分布具有长尾特征,即它的概率密度函数在尾部衰减缓慢。**它通常用于描述具有幂律分布的现象,例如财富分布、城市人口分布等。
random.paretovariate(alpha)
alpha
:表示 Pareto 分布的形状参数(shape parameter),也称为 Pareto 指数。函数会基于给定的参数生成一个服从 Pareto 分布的随机浮点数,并返回该随机数。
random.paretovariate(2)
1.9497962897818355
Weibull 分布是一种连续概率分布,常用于模拟具有不同可靠性特征的事件的发生时间。它的形状可以随着形状参数 alpha 的变化而改变,可以是指数分布、正态分布或右偏斜分布的特例。
random.weibullvariate(alpha, beta)
函数会基于给定的参数生成一个服从 Weibull 分布的随机浮点数,并返回该随机数。
random.weibullvariate(2 ,1)
0.9068611766875241