# 2.1.4:随机数生成 ## 简单随机数生成 NumPy 的 random 模块下提供了许多生成随机数的函数,如果对于随机数的概率分布没有什么要求,则通常可以使用 random_sample 、choice 、randint 等函数来实现生成随机数的功能。 ### random_sample random_sample 用于生成区间为 [0, 1] 的随机数,需要填写的参数 size 表示生成的随机数的形状,比如 size=[2, 3] 那么则会生成一个 2 行 3 列的 ndarray ,并用随机值填充。示例代码如下: ```python import numpy as np print(np.random.random_sample(size=[2, 3])) ``` 输出可能如下: ```python [[0.32343809 0.38736262 0.42413616] [0.86190206 0.27183736 0.12824812]] ``` ### choice 如果想模拟像掷骰子、扔硬币等这种随机值是离散值,而且知道范围的可以使用 choice 实现。choice 的主要参数是 a 和 size 。 a 是个一维数组,代表你想从 a 中随机挑选;size 是随机数生成后的形状。假如模拟 5 次掷骰子,代码如下: ```python import numpy as np ''' 掷骰子时可能出现的点数为1, 2, 3, 4, 5, 6,所以a=[1,2,3,4,5,6] 模拟5此掷骰子所以size=5 结果可能为 [6, 4, 3, 1, 3] ''' print(np.random.choice(a=[1, 2, 3, 4, 5, 6], size=5)) ``` 输出可能如下: ```python [6 4 3 1 3] ``` ### randint randint 的功能和 choice 差不多,只不过 randint 只能生成整数,而 choice 生成的数与 a 有关,如果 a 中有浮点数,那么 choice 会有概率挑选到浮点数。 randint 的参数有 3 个,分别为 low ,high 和 size 。其中 low 表示随机数生成时能够生成的最小值, high 表示随机数生成时能够生成的最大值减 1 。也就是说 randint 生成的随机数的区间为 [low, high) 。假如模拟 5 次掷骰子,代码如下: ```python import numpy as np ''' 掷骰子时可能出现的点数为1, 2, 3, 4, 5, 6,所以low=1,high=7 模拟5此掷骰子所以size=5 结果可能为 [6, 4, 3, 1, 3] ''' print(np.random.randint(low=1, high=7, size=5) ``` 输出可能如下: ```python [6 4 3 1 3] ``` ## 概率分布随机数生成 如果对于产生的随机数的概率分布有特别要求,NumPy 同样提供了从指定的概率分布中采样得到的随机值的[接口](https://www.numpy.org/devdocs/reference/routines.random.html?highlight=random#module-numpy.random)。在这里主要介绍高斯分布。 高斯分布又称为正态分布,其分布图形如下: ![高斯分布](2.jpg) 上图中横轴为随机变量的值(**在这里可以看成是产生的随机值**),纵轴表示随机变量对应的概率(**在这里可以看成是随机值被挑选到的概率**)。 其实在日常生活中有很多现象或多或少都符合高斯分布。比如某个地方的高考分数,一般来说高考分数非常低和高考分数非常高的学生都比较少,而分数中规中矩的学生比较多,如果所统计的数据足够大,那么高考分数的概率分布也会和上图一样,**中间高,两边低**。 想要实现根据高斯分布来产生随机值,可以使用 normal 函数。示例代码如下: ```python import numpy as np ''' 根据高斯分布生成5个随机数 结果可能为:[1.2315868, 0.45479902, 0.24923969, 0.42976352, -0.68786445] 从结果可以看出0.4左右得值出现的次数比较高,1和-0.7左右的值出现的次数比较低。 ''' print(np.random.normal(size=5) ``` 输出可能如下: ```python [1.2315868 0.45479902 0.24923969 0.42976352 -0.68786445] ``` 其中 normal 函数除了 size 参数外,还有两个比较重要的参数就是 loc 和 scale ,它们分别代表高斯分布的**均值**和**方差**。 loc 影响的分布中概率最高的点的位置,假设 loc=2 ,那么分布中概率最高的点的位置就是 2 。下图体现了 loc 对分布的影响,其中蓝色f分布的 loc=0 ,红色分布的 loc=5 。 ![均值对高斯分布的影响](3.jpg) scale 影响的是分布图形的胖瘦,scale 越小,分布就越又高又瘦,scale 越大,分布就越又矮又胖。下图体现了 scale 对分布的影响,其中蓝色分布的scale=0.5 ,红色分布的 scale=1.0 。 ![方差对高斯分布的影响](4.jpg) 所以,想要根据均值为 1 ,方差为 10 的高斯分布来生成 5 个随机值,代码如下: ```python import numpy as np print(np.random.normal(loc=1, scale=10, size=5) ``` 输出可能如下: ```python [1.52414964 7.08225325 13.26337651 4.29866004 9.89972241] ``` ## 随机种子 前面说了这么多随机数生成的方法,那么随机数是怎样生成的呢?其实计算机产生的随机数是由随机种子根据一定的计算方法计算出来的数值。**所以只要计算方法固定,随机种子固定,那么产生的随机数就不会变!** 如果想要让每次生成的随机数不变,那么就需要设置随机种子(**随机种子其实就是一个0到4294967295的整数**)。设置随机种子很长简单,调用 seed 函数并设置随机种子即可,代码如下: ```python import numpy as np # 设置随机种子为233 np.random.seed(seed=233) data = [1, 2, 3, 4] # 随机从data中挑选数字,结果为4 print(np.random.choice(data)) # 随机从data中挑选数字,结果为4 print(np.random.choice(data)) ``` 输出如下: ```python 4 4 ```