0%

Python的random模块

在日常生活中,随机数我们很多时候都会经常接触到,比如说游戏抽卡,随机到的数值就可以决定这波抽卡的结果是欧皇附体、正常水平还是直接吃井(保底)。正如其它编程语言一样,Python也有生成随机数的功能,其中有一个很重要的模块即是random,为了加深记忆,这篇文章记录一下该模块的一些主要的函数及其功能。

注:Random模块生成的随机数并不具备加密安全性,因此不能用于生成加密算法中所需的随机数。此时应当使用secrets模块(其适用于Python 3.6及其之后版本),其生成的随机数具有高加密强度。(小于3.6的话可使用os.urandom()方法和random.SystemRandom类)

1. 导入模块

导入模块很简单,在代码开头导入random包即可(或者使用from语句导入random包中特定函数)。

1
import random

2. 常见函数

2.1 设定种子

random.seed(a=None)

该函数用于初始化随机数生成器,参数a为选定的随机种子,其可以为NoneType,int,float,str,bytes和bytearray类型。

如果没有给定种子的话,Python默认使用当前系统时间作为种子。

随机种子的作用

计算机生成的随机数一般都是伪随机数,并不能做到真正的随机。它们主要使用特定的随机数生成算法来进行生成,像Python主要使用的随机数生成算法是梅森旋转算法(Mersenne twister)。而种子的作用主要是作为生成随机数的函数的初始输入,而对于相同的种子,在单线程情况下,无论跑多少次,随机数生成算法生成的数字是完全相同的,这也是为什么被称之为伪随机的原因。而计算机默认情况下使用系统时间也是因为可以保证每次生成随机数的时候种子是不同的。

1
2
3
4
5
6
>>> random.seed(1)
>>> random.random()
0.13436424411240122
>>> random.seed(1)
>>> random.random()
0.13436424411240122

2.2 选取随机整数

random.randrange ([start,] stop [,step])

从 range(start, stop, step) 返回一个随机选择的元素,类似于 choice(range(start, stop, step)) ,但实际上并没有构建一个 range 对象。(官方文档解释)

该函数返回一个[start,stop)范围内的随机整数,start和step可以省略。start的默认值为0, step默认值为1。

random.randint(a, b)

随机返回一个[a,b]范围内的整数N(a<=N<=b),其等价于random.randrange(a, b+1)

注:randrange是左闭右开的,而randint两边都是闭区间

2.3 从序列中随机选取元素/子序列

random.choice(seq)

从序列中随机选取一个元素,若序列为空,则报IndexError错误

random.choices(population, weights=None, *, cum_weights=None, k=1)

从序列中有放回地随机抽取k个元素,并返回对应的数组,weights参数代表每个元素被选到的相对权重,而cum_weights代表的是累积权重,它们的长度需和待抽取序列population长度一致。若无设置权重,则每个元素被抽到的权重是一样的。

注:权重不能为负值,否则会报错

1
2
3
>>> a = ['alice', 'bob', 'helen', 'jack', 'sue']
>>> random.choices(a, weights = [3,1,2,1,5], k=4)
['helen', 'helen', 'sue', 'helen']
random.sample(population, k, *, counts=None)

从序列中无放回地随机抽取k个元素。

1
2
3
>>> a = ['alice', 'bob', 'helen', 'jack', 'sue']
>>> random.sample(a,3)
['sue', 'jack', 'bob']

2.4 随机打乱序列

random.shuffle(x[, random])

随机打乱序列,可选参数random为特定的无参数的生成随机数的函数,默认为random()
该函数会直接改变序列的值,若需返回一个新的随机打乱序列,可使用random.sample(x,len(x))

1
2
3
4
>>> a = ['alice', 'bob', 'helen', 'jack', 'sue']
>>> random.shuffle(a)
>>> a
['jack', 'bob', 'alice', 'helen', 'sue']

2.5 产生符合特定分布的随机浮点数

random.random()

返回 [0.0, 1.0) 范围内的下一个随机浮点数。

random.uniform(a, b)

返回一个随机浮点数N,当a<=b时a<=N<=b,当b<a时b<=N<=a。

取决于等式 a+(b-a)*random() 中的浮点舍入,终点b可以包括或不包括在该范围内。(官方文档解释)

即生成一个符合在Uniform均匀分布区间内的浮点数。

除了以上两种之外,random也可以生成符合gauss分布,gamma分布,正态分布,指数分布等的随机数,它们也有特定的生成函数。