1. 随机数
np.random.random()
是最常用的随机数生成函数,该函数生成的随机数随机均匀分布于[0, 1)
区间。如果不提供参数,np.random.random()
函数返回一个浮点型随机数。np.random.random()
函数还可以接受一个整型或元组参数,用于指定返回的浮点型随机数数组的结构(shape)。也有很多人习惯使用np.random.rand()
函数生成随机数,其功能和np.random.random()
函数一样,知识np.random.rand()
函数不接受元组参数,必须要写成两个整型参数
import numpy as np
print(np.random.random())
print(np.random.random(2))
print(np.random.random((2,3)))
np.random.randint()
是另一个常用的随机数生成函数,该函数生成的随机整数均匀分布于[low, high)
区间。如果省略low参数,则默认low的值等于0。np.random.randint()
函数还有一个默认参数size
,用于指定返回的整型随机数数组的结构(shape)
print(np.random.randint(10))
print(np.random.randint(10, size=5))
print(np.random.randint(10, size=(2,5)))
print(np.random.randint(10, 100, size=(2,5)))
2. 随机抽样
随机抽样是从指定的有序列表中随机抽取指定数量的元素。随机抽样的应用比较广泛,如产品抽检、抽签顺序等。NumPy的随机抽样函数是np.random.choice()
,其原型如下
np.random.choice(a, size=None, replace=True, p=None)
参数a表示待抽样的全体样本,它值接受整数或一维的数组(列表)。参数a如果是整数,相当于将数组np.arange(a)
作为全体样本。参数size用于指定返回抽样结果数组的结构(shape)。参数replace用于指定是否允许多次抽取同一个样本,默认为允许。参数p是和全体样本集合等长的权重数组,用于指定对应样本被抽中的概率。
import numpy as np
print(np.random.choice(1,5)) # 抽签样本只有1个元素0,抽取5次
print(np.random.choice(['a','b','c'], size=(3,5), p=[0.5,0.25,0.25])) # 指定权重
print(np.random.choice(np.arange(100), size=(2,5), replace=False)) # 不允许重复
3. 正态分布
使用np.random.randn()
函数是最简单的生成标准正态分布随机数的方法。np.random.randn()
函数用于生成均值为0、标准差为1的正态分布(标准正态分布)的随机数、该函数可以接受一个或两个整型参数,用来指定返回的符合标准正态分布的随机数数组的结构(shape)
import numpy as np
print(np.random.randn()) # 标准正态分布,均值为0,标准差为1
print(np.random.randn(5))
print(np.random.randn(2,5))
如果需要生成非标准正态分布随机数,则应该使用np.random.normal()
函数。np.random.nomal()
函数默认生成均值为0、标准差为1的正态分布随机数。参数loc用于指定均值,参数scale用于指定标准差,参数size用于指定返回的符合正态分布的随机数数组的结构(shape)。从下面的代码可以看出,和使用默认标准差相比,指定标准差为0.2时,数据分布更加靠近均值
print(np.random.normal()) # 默认均值为0,标准差为1
print(np.random.normal(loc=2, size=5)) # 参数loc指定均值为2
print(np.random.normal(loc=2, scale=0.2, size=(2,5))) # 参数loc指定均值为2,参数scale指定标准差为0.2
4. 伪随机数的深度思考
-
计算机程序或编程语言中的随机数都是伪随机数。因为计算机硬件是确定的,代码是固定的,算法是准确的,通过这些确定的、固定的、准确的东西不会产生真正的随机数,除非引入这个封闭系统以外的因素。计算机系统的随机算法一般使用线性同余或平方取中的算法,通过一个种子(通常用时钟代替)产生。这意味着,如果知道了种子和已经产生的随机数,就可能获得接下来随机数序列的信息,这就是伪随机数的可预测性
-
NumPy随机数函数内部使用了一个伪随机数生成器,这个生成器每次实例化时都需要一个种子(整数)完成初始化。如果两次初始化的种子相同,则每次初始化后产生的随机数序列就完全一致。
np.random.seed()
函数可以指定伪随机数生成器的初始化种子import numpy as np np.random.seed(12345) # 使用'12345'随机种子初始化伪随机数生成器 print(np.random.random(5)) print(np.random.random((2,3))) np.random.seed(12345) # 再次使用'12345'随机种子初始化伪随机数生成器 print(np.random.random(5)) # 和上面完全一致 print(np.random.random((2,3))) # 和上面完全一致
-
从上述代码汇总可以看出,只要指定相同的种子,接下来的随机序列就完全一致。这意味着,只有从外部引入真正的随机因子(如天空云朵的形状、邻居家无线网络信号的强度等)作为种子,才可以得到真正的随机数
-
此外,NumPy还提供了随机数生成器,可以直接操作这个生成器来生成随机数
r = np.random.RandomState(12345) # 使用随机数生成器也同样 print(r.random(5)) # 和上面完全一致 print(r.random((2,3))) # 和上面完全一致