生成随机数
0、佐佑思维公众号已公开,欢迎去看!
1、需要导入的库
名称 | 命令 | 生成随机数的代码句 |
---|---|---|
统计函数库 | scipy.stats | scipy.stats.norm.rvs(loc = 0,scale = 0.1,size =10) |
数组、矩阵库 | numpy | numpy.random.normal(loc=0.0, scale=1.0, size=10)) |
上述俩个库中包含指定分布生成随机数的函数方法,所以我们可以利用导入的库函数实现随机数的生成。
2、scipy.stats库法
2.1、步骤
- 导入库
- 定参数
- 输出结果
2.2、代码
import scipy.stats as st #导入统计函数库,令其用st表示
loc1= 0;scale1= 0.1;size1=(2,2) #赋予参数值
print(st.norm.rvs(loc=loc1,scale=scale1,size=size1))#输出
运行:
如图所示,可以得到随机数组成的数组结果。但是通过对比结果一和结果二,代码是一样的,但是输出结果却不一样,这就说明这种方法生成的随机数是在不停地变化的,多次运行的结果都会不一样,不过这样也达到了目的,却无法重现你的代码结果。
2.3、代码详细解释
代码 | 解释 |
---|---|
import scipy.stats | 导入scipy.stats库 |
as st | 用st表示scipy.stats库 |
loc、scale | 参数,表示随机变量的偏移和缩放,在这里对应正态分布的平均值和标准差 |
size | 参数,表示生成的大量随机数会储存在什么样的数据空间中,是一维数组呢,还是多维,None 表示只生成一个数 |
st.norm.rvs | norm表示正态分布,rvs表示生成随机数,组合到一起就是生成正态分布的随机数,那么这样就可以替换norm从而生成其他指定分布的随机数 |
3、numpy库法
3.1、步骤
步骤与前一个方法类似。
3.2、代码
import numpy as np #导入numpy库,令其用np表示
loc1= 0;scale1= 0.1;size1=(2,2) #赋予参数值
print(np.random.normal(loc=loc1,scale=scale1,size=size1))
运行:
可以看出上述代码还是无法实现重现,但是我们可以在这种方法的基础上引入一个随机种子和伪随机数生成器(RandomState
)实现重现。
3.3、代码详细解释
代码 | 解释 |
---|---|
import numpy | 导入numpy库 |
as np | 用 np 表示numpy库 |
loc、scale、size | 参数,在这里表示正态分布的平均值、标准差、储存数组形状 |
np.random.normal | random表示生成随机数,normal表示正态分布,组合到一起就是生成正态分布的随机数 |
4、RandomState方法可重现随机结果
4.1、方法概述
随机种子的方法在笔者看来就是:
- 只要给定一个随机种子值,伪随机数生成器就会根据种子有一个对应的伪随机顺序
- 伪随机就是看似随机的固定顺序
4.2、引入随机种子的原因
笔者观点:
- 别人运行此代码用同样的随机种子值就会复现你的过程,即,若不设置此参数则会随机选择一个种子,执行结果也就不同了;
- 在做一些复杂的机器学习等模型训练时,某个随机种子在训练集上表现好,未必在陌生训练集上表现好。
4.3、步骤
- 导入RandomState:from numpy.random import RandomState
- 给定随机种子值:random_state=1
- 生成伪随机数器:rdm = RandomState(random_state)
- 设定参数:loc = 0,scale = 0.1,size =10
- 输出结果:print(rdm.normal(loc, scale, size))
4.4、最推荐代码
from numpy.random import RandomState #导入RandomState库
random_state=1 #给定随机种子值
rdm = RandomState(random_state) #生成伪随机数器
loc = 0;scale = 0.1;size =10; #设定参数值
print(rdm.normal(loc, scale, size)) #输出随机数
可以看到两个随机种子rdm1
、rdm2
都取 random_state=1
,结果是一样的!
但是,如果print(rdm.normal(loc, scale, size))
输出两遍,那么结果是否一样呢?
这里给出了答案,我相信大家也可以得出一样的结果,若有问题,欢迎大家交流!