专注统计和Python学习分享
点击上面的statspy关注一下吧
Python内置模块之random
文章导读
random模块是一个产生随机数的模块,很多其他的科学计算相关的第三方包肯定是使用了random模块的,可见它的重要性。
它的功能强大之处不仅仅是产生随机数,重要的是“随机”,可以理解为高度模拟。它的具体实现不去探究,在这里只是介绍它的一些实用方法。
一、随机数生成器
随机数生成器是random模块中产生“随机”效果的核心,这里要说的是初始化一个随机数生成器的主要方法,很简单,即实用方法random.seed()传递一个整数即可,这样子就初始化了一个随机数生成器,才有后面的一系列“随机”的效果。
不同的随机数生成器,得到的随机效果是不同的,也就是说可以通过方法random.seed()传递不同的参数,来改变随机效果,而且在同一个随机数生成器下,产生的随机效果是相同的。这个也叫做随机数种子。
import random as rdfor i in range(3): rd.seed(1) print(rd.randint(1,5))print(rd.randint(1,5))
可以看出,在同一个随机数生成器下,调用一个随即效果的函数,得到的结果是相同的,不同的随机数种子下,结果不同。验证了上面的说法。
二、整数相关的随机函数
所谓整数相关的随机函数,就是指它们给出的随机效果是应用在整数范围上。主要是有两个函数:
- random.randint(a,b),随机地返回闭区间[a,b]上的一个整数。
- randon.randrange(a,b), 随机地返回左闭右开区间[a,b)上的一个整数,类似range函数。
import random as rddef random_integer(a, b, seed=None): rd.seed(seed) num1=rd.randint(a,b) # 1~10随机返回一个整数 num2=rd.randrange(a,b) return num1,num2for i in range(4): print(random_integer(1,10))
它们的区别就是:一个只返回闭区间,一个返回左闭右开区间的随机整数,而且一般地,我们需要在很大的整数序列中,选择一个随机整数,最好使用random.randrange()。
三、序列相关的随机函数字
这里的序列一般是指:列表,或者集合,元组很少用。主要是四个函数:random.choice(), random.choices(),random.shuffle(),random.sample(),分别的作用是随机地从序列中选择一个,选择多个,打乱一个序列的顺序,以及从序列中随机取样。
具体的用法如下:
- random.choice(seq) 从序列seq中随机地选择一个元素。
- random.choices(population, weights=None, k=1) 从序列population中随机选择k个元素(可重复),weights指定每个元素的权重。
- random.shuffle(seq) 打乱一个可变的序列,原始位置上操作。
- random.sample(population, k) 从序列population中选择k个元素,不重复采样。和
很类似。random.choices()
import random as rddef random_seq(a,b): rd.seed(1) lst=[i for i in range(a,b) if i%2!=0] print('随机地选择一个元素为:', rd.choice(lst)) print('随机地选择多个元素有:', rd.choices(lst,k=5)) print('重采样选择5个元素:', rd.sample(lst,k=5)) rd.shuffle(lst) return lstlst=random_seq(1,11)print(lst)
可以看到,random.choices()是可以重复选择的,这就表示采样,采样,一般来说,每个个体只能被取到一次或者零次,而不是多次。random.sample()是采样,不能重复选择的。
四、随机分布
这里的随机分布,主要是模拟生成统计学中的一些概率分布的密度函数。还有一个比较特殊的函数,random.random(),它是返回0,1之间的随机小数,不需要传递任何参数。
import random as rdfor i in range(4): print('第{}次的随机小数为:'.format(i), rd.random())
至于统计学中的各种随机分布的概率密度函数,最重要的就是正态(高斯)分布了,这里也有相关的函数实现,random.gauss(mu,sigma)
print(rd.gauss(0,1))
它返回的是标准正态分布的一个随机点,这样子有什么有用呢?目前我还不知道,肯定是有用的。
至少可以多次取点,做一个简单的验证,验证这些点是不是服从标准正态分布,肯定是能通过正态性检验的,因为这些随机点是来自标准正态分布的。类似的函数还有:
-
,指数分布,需要传递一个参数,λ,也就是theta分之一。random.expovariate(lambda)
-
表示韦布尔分布。random.weibullvariate(alpha,beta)
-
表示均匀分布,。random.uniform(a,b)
-
对数正态分布。random.lognormvariate(mu, sigma)
-
gamma分布。random.gammavariate(alpha, beta)
import random as rdprint(rd.expovariate(1)) # 这里的lambda似乎就是thetaprint(rd.uniform(0,1))print(rd.lognormvariate(0,1))
这些随机分布比较少,后面在numpy包中的random模块中,有更多的统计随机分布函数支持。
内置数据类型之random模块完结!
END
部分图片|来自网络
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
往期回顾
更多精彩
Python内置类型之datetime模块
Python内置类型之time模块
Python内置函数(二)终结
关注我们,扫码了解一下吧