写点什么

滚雪球学 Python 之内置 random 模块

发布于: 2021 年 03 月 16 日
滚雪球学 Python 之内置 random 模块

橡皮擦,一个逗趣的互联网高级网虫,新的系列,让我们一起 Be More Pythonic


已完成的文章清单


  1. 滚雪球学 Python 第二轮开启,进阶之路,列表与元组那些事儿

  2. 说完列表说字典,说完字典说集合,滚雪球学 Python

  3. 关于 Python 中的字符串,我在补充两点,滚雪球学 Python

  4. 列表推导式与字典推导式,滚雪球学 Python

  5. 滚雪球学 Python 之 lambda 表达式

  6. 滚雪球学 Python 之内置函数:filter、map、reduce、zip、enumerate

  7. Python 中级知识之装饰器,滚雪球学 Python

  8. 滚雪球学 Python 之闭包操作,本系列第 8 篇文章

  9. 滚雪球学 Python 之怎么玩转时间和日期库

  10. 滚雪球学 Python 之作用域下的 global 和 nonlocal 关键字

  11. 哈希吧,滚雪球学 Python 哈希表与可哈希对象


十二、Python 内置模块之 random


random 库是 Python 中生成随机数的标准库,包含的函数清单如下:


  • 基本随机函数:seedrandomgetstatesetstate

  • 扩展随机函数:randintgetrandbitsrandrangechoiceshufflesample

  • 分布随机函数:uniformtriangularbetavariateexpovariategammavariategausslognormvariatenormalvariatevonmisesvariateparetovariateweibullvariate

发现单词 variate 出现频率比较高,该但是是变量的意思。


12.1 基本随机函数


12.1.1 seed 与 random 函数


seed 函数初始化一个随机种子,默认是当前系统时间。

random 函数 生成一个 [0.0,1.0) 之间的随机小数 。


具体代码如下:


import random
random.seed(10)
x = random.random()print(x)
复制代码


其中需要说明的是 random.seed 函数, 通过 seed 函数 可以每次生成相同的随机数,例如下述代码:


import random
random.seed(10)x = random.random()print(x)
random.seed(10)y = random.random()print(y)
复制代码


在不同的代码上获取到的值是不同的,但是 x 与 y 是相同的。


0.57140259468991350.5714025946899135
复制代码


12.1.2 getstate() 和 setstate(state)


getstate 函数用来记录随机数生成器的状态,setstate 函数用来将生成器恢复到上次记录的状态。


# 记录生成器的状态state_tuple = random.getstate()for i in range(4):    print(random.random())print("*"*10)# 传入参数后恢复之前状态random.setstate(state_tuple)for j in range(4):    print(random.random())
复制代码


输出的随机数两次一致。


0.100432961407917580.61836686655040620.69643285906931090.6702494141830372**********0.100432961407917580.61836686655040620.69643285906931090.6702494141830372
复制代码


12.2 扩展随机函数


random 扩展随机函数有如下几个:


`randint`、`getrandbits`、`randrange`、`choice`、`shuffle`、`sample`
复制代码


12.2.1 randint 和 randrange


randint 生成一个 [x,y] 区间之内的整数。

randrange 生成一个 [m,n) 区间之内以 k 为步长的随机整数。


测试代码如下:


x = random.randint(1,10)print(x)
y = random.randrange(1,10,2)print(y)
复制代码


这两个函数比较简单,randint 函数原型如下:


random.randint(start,stop)
复制代码


参数 start 表示最小值,参数 stop 表示最大值,两头都是闭区间,也就是 startstop 都能被获取到。


randrange 函数原型如下:


random.randrange(start,stop,step)
复制代码


如果函数调用时只有一个参数,默认是从 0 到该参数值,该函数与 randint 区别在于,函数是左闭右开,最后一个参数是步长。


查阅效果,可以复制下述代码运行:


for i in range(3):    print("*"*20)    print(random.randrange(10))    print(random.randrange(5,10))    print(random.randrange(5,100,5))
复制代码


12.2.2 getrandbits(k) 和 choice(seq)


getrandbits 生成一个 k 比特长的随机整数,实际输出的是 k 位二进制数转换成的十进制数。

choice 从序列中随机选择一个元素。


x =  random.getrandbits(5)print(x)# 生成的长度是 00000-11111
复制代码


getrandbits(k) 函数可以简单描述如下:输出一个 $[0,2^k-1]$ 范围内一个随机整数,k 表示的是 2 进制的位数。


choice 就比较简单了,从列表中返回一个随机元素。


import random
my_list = ["a", "b", "c"]
print(random.choice(my_list))
复制代码


12.2.3 shuffle(seq) 和 sample(pop,k)


shuffle 函数用于将序列中的元素随机排序,并且原序列被修改。

sample 函数用于从序列或者集合中随机选择 k 个选择,原序列不变。


my_list = [1,2,3,4,5,6,7,8,9]random.shuffle(my_list)
print(my_list)
复制代码


shuffle 函数只能用于可变序列,不可变序列(如元组)会出现错误。


my_list = ["梦想", "橡皮擦", 1, 2, [3, 4]]print(my_list)ls = random.sample(my_list, 4)print(ls)
复制代码


12.3 分布随机函数


该部分涉及的比较多,重点展示重要和常见的一些函数。


12.3.1 uniform(a,b) 、betavariate 和 triangular 函数


uniform 生成一个 [a,b] 之间的随机小数,采用等概率分布。

betavariate 生成一个 [0,1] 之间的随机小数,采用 beta 分布。

triangular 生成一个 [low,high] 之间的随机小数,采用三角分布。


在使用 uniform 时候需要注意,如果 a<b,那么生成一个 b-a 之间的小数。


for i in range(3):    print(random.uniform(4, 1))
复制代码


12.3.2 其它分布随机函数


以下都是生成随机数的方法,只是底层核心算法不同。

、、、、、、、。


  1. expovariate:生成一个 (0,∞) 之间的随机整数,指数分布;

  2. gammavariate:采用 gamma 分布;

  3. gauss:采用高斯(正太)分布;

  4. lognormvariate:对数正太分布;

  5. normalvariate:正太分布;

  6. vonmisesvariate:冯米赛斯分布;

  7. paretovariate:帕累托分布;

  8. weibullvariate:韦伯分布。


12.4 这篇博客的总结


本篇博客学习了 Python 中随机数相关的知识点,希望对你有所帮助。


相关阅读


  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧

  2. Python 爬虫小课,精彩 9 讲




博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。


发布于: 2021 年 03 月 16 日阅读数: 17
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
滚雪球学 Python 之内置 random 模块