numpy.random模块提供了很多生成随机数的函数,可以选择生成符合某种概率分布的随机数。比如我们可以用normal得到一个4 x 4的,符合标准正态分布的数组:
import numpy as np
samples = np.random.normal(size=(4, 4))
samples
array([[ 0.5382462 , -0.79452471, -0.07993797, 0.72243531], [ 0.87180676, 1.61663011, -0.62169955, 1.73880636], [ 1.88294218, 0.07432438, 1.63474848, 0.23519213], [ 0.92847885, -0.45791646, 0.63965317, -0.23654448]])
相对的,python内建的random模块一次只能生成一个样本。在生成大量样本方法,numpy.random是非常快的:
from random import normalvariate
N = 1000000
%timeit sample = [normalvariate(0, 1) for _ in range(N)]
1 loop, best of 3: 1.25 s per loop
%timeit np.random.normal(size=N)
10 loops, best of 3: 49.1 ms per loop
之所以称之为伪随机数,是因为随机数生成算法是根据seed来生成的。也就是说,只要seed设置一样,每次生成的随机数是相同的:
np.random.seed(1234)
当然,这个seed是全局的,如果想要避免全局状态,可以用numpy.random.RandomState来创建一个独立的生成器:
rng = np.random.RandomState(1234)
rng.randn(10)
array([ 0.47143516, -1.19097569, 1.43270697, -0.3126519 , -0.72058873, 0.88716294, 0.85958841, -0.6365235 , 0.01569637, -2.24268495])
下面是是写numpy.random里的函数: