- 简述
- 常用方法及解析
- 小栗子
random 模块实现了各种分布的伪随机数生成器,利用这些伪随机数生成器,我们可以得到伪随机的数或者序列。
可以通过属性 random.__all __ 来获取模块内所有公开的函数。random 模块几乎所有函数都依赖于基本函数 random() ,它在半开放区间 [0.0,1.0) 内均匀地生成随机浮点数。 Python 使用 Mersenne Twister 作为核心生成器,它产生 53 位精度浮点数,周期为 219937-1 ,其在 C 的底层实现,既快又线程安全。 Mersenne Twister 是现存测试最广泛的随机数发生器之一。 但是,因为它的完全确定性,它不适用于所有工作,且完全不适合加密工作。
random 模块提供的函数其实是 random.Random 类的隐藏实例的绑定方法,该隐藏实例名为 _inst ,它在 random 导入时被创建,并将其方法导出为模块级函数,这些函数在用户代码和 Python 库中共享状态。如果你想获取不共享状态的生成器,可以通过实例化 random.Random 来实现。
除了 Random 类,random 模块还提供了 SystemRandom 类,它使用系统函数 os.urandom() 从操作系统提供的源中生成随机数。这并非适用于所有系统, 也不依赖于软件状态,序列不可重现。
下面介绍 random 模块中常用的函数
常用的方法
random.random()
功能:返回 [0.0, 1.0) 区间内的一个伪随机浮点数
参数:无
返回值:一个浮点数
uniform(a, b)
功能:返回 [a, b] 或 [a, b)区间(这取决于a+(b-a)*random()中的浮点舍入)内的一个伪随机浮点数
参数:a, b可以是整数也可以是浮点数,a 也可以大于 b,其中小的为起点,大的为终点
返回值:一个浮点数
randint(a, b)
功能:返回 [a, b] 区间内的一个随机整数
参数:a 和 b 为两个整数,且 a<=b
返回值:一个整数
choice(seq)
功能:从非空序列 seq 返回一个随机元素
参数:seq 为非空序列
返回值:seq 中的一个元素
choices(population, weights=None, cum_weights=None, k=1)
功能:从 population 中选择,返回长度为 k 的列表
参数:population 表示一个序列,weights 表示相对权重,cum_weights 表示累计权重,k 表示从 population 中选出元素(可重复)的个数
返回值:一个长度为 k 的列表
说明:如果指定了 weight 序列,则根据相对权重进行选择。 或者,如果给出 cum_weights 序列,则根据累积权重进行选择。
例如,相对权重``[10, 5, 30, 5]``相当于累积权重``[10, 15, 45, 50]``。
在内部,相对权重在进行选择之前会转换为累积权重,因此提供累积权重可以节省工作量。
如果既未指定 weight 也未指定 cum_weights ,则以相等的概率进行选择。 如果提供了权重序列,则它必须与 population 序列的长度相同。
此处应有个例子:
"""
import random
li = [1, 2]
print(random.choices(population=li, cum_weights=[2, 10], k=10))
# [2, 2, 1, 1, 2, 2, 1, 1, 2, 2]
# 每次输出结果基本都不一样,但明显可以看出 2 的个数要比 1 多
"""
randrange(start, stop[, step])
功能:从开始为 start,结束为 stop,步长为 step 的序列中随即返回一个元素
参数:start 表示起点,stop 表示终点,step 表示步长,步长可选
返回值:[start, stop)序列中的一个元素
说明:该函数相当于 choice(range(start, stop, step)) ,但实际上并没有构建一个 range 对象。
shuffle(x[, random])
功能:将序列 x 随机排序
参数:x 表示一个可变序列,random 表示一个 0 参函数,在 [0.0, 1.0) 中返回随机浮点数;默认情况下,这是函数 random()
返回值:None
sample(population, k)
功能:返回从给定序列或集合中选择的唯一元素的长度为 k 的列表。 用于无重复的随机抽样
参数:population 表示给定的序列或集合,k 表示返回列表的长度
返回值:返回包含来自 population 元素的新列表,同时保持 population 不变
说明:要从一系列整数中选择样本,请使用 range() 对象作为参数。 因为对于大量数据来说,这种方法特别快且节省空间
seed(a=None, version=2)
功能:指定种子来初始化伪随机数生成器。
参数:a 表示随机数种子,若为 None,则默认为是当前的系统时间,version 表示版本号
返回值:None
说明:a 可以是 int,若为 str 、 bytes 或 bytearray 则转换为 int 并使用它的所有位(对于版本 2)
getstate()
功能:获取生成器当前内部状态的对象,这个对象可以传递给 setstate() 来恢复状态
参数:无
返回值:一个三元组,表示生成器的内部状态
setstate(state)
功能:从 getstate() 返回的对象中恢复内部状态
参数:state 应该是 getstate() 的返回对象
返回值:None
getrandbits(k)
功能:生成具有 k个随机位的 int
参数:表示生成的随机数的二进制位数
返回值:一个整数
一些数学分布(不做详细介绍)
vonmisesvariatee(mu, kappa)
normalvariate(mu, sigma):正态分布
lognormvariate(mu, sigma):对数正态分布
expovariate(lambd):指数分布
gammavariate(alpha, beta):伽玛分布
triangular(low, high, mode):对称分布
gauss(mu, sigma):高斯分布
betavariate(alpha, beta):贝塔分布
paretovariate(alpha):帕累托分布
weibullvariate(alpha, beta):威布尔分布
随机生成验证码的小栗子
import random
def my_test(n):
password = ''
for i in range(n):
s1 = chr(random.randint(65, 90))
s2 = str(random.randint(0, 9))
password += random.choice([s1, s2])
return password
print(my_test(6))