Python模块random, math
〇、前言
本系列(指Python Moudules系列)每篇介绍一个或多个内容没有特别多模块
模块介绍依赖官方文档(https://docs.python.org/zh-cn/3.8/library/index.html)或其他第三方官方文档,主要是对其内容的补充和拓展
内容大部分来源官方文档,少部分来源网络。太过深奥的内容会只写出不介绍,或省略,或省略掉太过深奥的部分(例如省略部分参数),或通过补充介绍(补充介绍的前面通常会有参考网址)
注意内容非常依赖编号。内容中类的展示方式是"编号<数字>."表示类的构造方法(__init__),"编号<数字>.<数字>"表示类的方法或属性,方法一般是实例方法,其他方法会在前面备注,属性一般是实例属性,类属性会在后面备注。如果构造方法无需传参会直接展示类名
使用Python版本3.8,但也会补充高版本的修改和添加内容。系统Windows 7
系列WPS笔记及其他内容的百度网盘链接:
https://pan.baidu.com/s/1fTwjyoM81_OOAccPNhGE9Q?pwd=h3fg
颜色代表含义:
淡灰色:注释,一般前面有#
绿色:示例
橙色:拓展
紫色:示例中的input用户输入内容
红色、蓝色:突出或装饰文字作用
部分内容可能不严谨或者错误,欢迎指出

一、random——生成伪随机数
(1)、概述
random内置模块实现了各种分布的伪随机数生成器。此模块的伪随机生成器不应用于安全目的,有关安全性或加密用途参阅secrets模块
(2)、函数
# 这个模块提供的函数实际上是random.Random类的隐藏实例的绑定方法,所以在Pychram的补全代码中显示的不是函数标识
1. seed(a=None)
初始化随机数生成器
a必须是NoneType、int、float、str、bytes或bytearray类型作为随机数生成的种子,被省略或为None的情况下,则使用当前系统时间。如果操作系统提供随机源,则使用它们(如果可用)
# None是NoneType类型的唯一实例
2. random()
返回半开半闭区间[0.0, 1.0)范围内的下一个随机浮点数
# 几乎所有模块函数都依赖于此函数
3. getstate()
返回捕获生成器当前内部状态的对象。这个对象可以传递给setstate()来恢复状态
4. setstate(state)
将生成器的内部状态恢复到调用getstate()获得状态对象state时的状态
5. getrandbits(k)
返回具有k个随机比特位的Python整数
# 比特位就是位(bit),0或1表示值
# 此函数在Python3.9可以传入0作为k的参数,在之前必须传入正整数
示例:
运行结果:
4 8 1 0.608733405172185
4 8 1 9 9 0.608733405172185
6. choice(seq)
从非空序列seq返回一个随机元素。如果seq为空,则引发IndexError
7. choices(population, weights=None, *, cum_weights=None, k=1)
从population中有重复地随机选取元素,返回大小为k的元素列表。如果population为空,则引发IndexError
weights——是一个序列,如果指定则根据相对权重进行选择
cum_weights——是一个序列,如果指定则根据累积权重进行选择
# 关于累积权重,例如相对权重[10, 5, 30, 5]相当于累积权重[10, 15, 45 ,50],10为相对权重的第一个元素,15为第一个元素加第二个元素,以此类推
在内部,相对权重在进行选择之前会转换为累积权重,因此提供累积权重可以节省工作量
如果既未指定weights也未指定cum_weights,则以相等的概率进行选择;如果既指定weights也指定cum_weights,则引发TypeError
如果提供了权重序列(weights或cum_weights),则它必须与population序列的长度相同。权重值可使用random()锁返回的能与float值进行互相运算的任何数字类型(包括整数、浮点数、分数但不包括decimal)。权重值应当非负且为有限的数值
# 有限的数值指不是inf、-inf之类的数值
# 在高版本Python中,权重值的和必须大于零,否则引发ValueError异常,而在Python3.8中不会,权重值应当为非负数且总和大于零
对于给定的种子,具有相等加权的choices()函数通常产生与重复调用choice()不同的序列。choices()使用的算法使用浮点运算来实现内部一致性和速度。choice()使用的算法默认为重复选择的整数运算,以避免因舍入误差引起的小偏差
示例:
运行结果:
3
[2]
[1, 2, 2, 1, 2] # 列表中之前选择过的元素可重复选择
8. randrange(stop)/randrange(start, stop[, step])
从range(start, stop, step)返回一个随机选择的元素。相当于choice(range(start, stop, step)),但实际上并没有构建一个range对象
应使用位置参数传参,位置参数匹配range()。不应使用关键字参数传参,因为此函数可能以意外的方式使用它们
# 例如randrange(start=100)被解释成了randrange(0, 100, 1)
# 在Python3.12中,传入非整数类型都会抛出TypeError
9. randint(a, b)
返回随机整数N,满足a <= N <= b。相当于randrange(a, b+1)
10. shuffle(x)
将序列x随机打乱位置。x需要是一个可变的序列,打乱会在序列x上进行。要改变一个不可变的序列并返回一个新的打乱列表请使用sample(x, k=len(x))
# 即使对于长度小的序列,序列的排列组合总数也会快速增长,大于大多数随机数生成器的周期,也就意味着长序列大多数的排列组合永远不会产生
11. sample(population, k)
返回从总体序列或集合population中选择的唯一元素的k长度列表。用于无重复的随机抽样
# 与choices()相比,choices()会重复的随机抽样
# 在3.11版本中,population如果是集合,将不会自动转换为列表
# 返回列表的子切片也是有效的随机样本
# population的元素可以重复
# 从一系列整数中选择样本,可使用range()对象作为参。对于从大量人群中采样,这种方法特别迅速且节省空间,例如sample(range(10000000), k=60)
如果样本大小k大于总体大小len(population),则引发ValueError
示例:
运行结果:
2
8
0
[4, 1, 3, 2, 5]
[3, 3, 2, 1]
[36, 33, 75, 38, 7]
12. uniform(a, b)
返回一个随机浮点数N,当a <= b时a <= N <= b,当b < a时b <= N <= a
# b可以包括或不包括在该范围内,取决于等式a + (b-a) * random()中的浮点取舍
13. triangular(low, high, mode)
三角形分布。返回一个随机浮点数N,使得low <= N <= high,并且偏向一个极端mode(众数)。low和high边界默认为0和1。mode参数默认为边界之间的中点,给出对称分布
14. betavariate(alpha, beta)
Beta分布。参数的条件是alpha > 0和beta > 0。返回值的范围介于0和1之间
补充:matplotlib第三方模块
matplotlib是Python的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式,可以用来绘制各种静态,动态,交互式的图表
下面将会使用这个模块pyplot子库的两个函数: # 并未给出全部可选参数
hist(x, bins=None, color=None)
计算并绘制直方图
x——指定要绘制直方图的数据,单一的数组([x0, x1])或一个数组序列(二维数组),每个数组中每个序列代表一个数据集
bins——设置长条形的数目
color——设置颜色,传入颜色('r', 'g, 'b'之类的字符串)或颜色序列,颜色序列中每个颜色对应一个数据集
show()
用于显示所有图形
示例:
运行结果:

15. expovariate(lambd)
指数分布。lambd是1.0除以所需的平均值,它应该是非零的。如果lambd为正,则返回值的范围为0到正无穷大;如果lambd为负,则返回值从负无穷大到0
# 因为"lambda"是Python的保留字,所以该参数叫做"lambd"
# 在3.12版本中添加了lambd的默认值1.0
16. gammavariate(alpha, beta)
Gamma分布(不是gamma函数)。参数的条件是alpha > 0和bata > 0
概率分布函数是:
17. gauss(mu, sigma)
正态分布,也称高斯分布。mu为平均值,而sigma为标准差。此函数要稍快于下面所定义的normalvariate()函数
# 多线程需要注意当两个线程同时调用此方法时,它们有可能获得相同的返回值。可通过三种办法来避免。1)让每个线程使用不同的随机数生成器实例。2)在所有调用外面加锁。3)改用速度较慢但是线程安全的normalvariate()函数
# 在3.11版本中添加了mu和sigma的默认值0.0和1.0
18. lognormvariate(mu, sigma)
对数正态分布。如果你采用这个分布的自然对数,你将得到一个正态分布,平均值为mu和标准差为 sigma。mu可以是任何值,sigma必须大于零
19. normalvariate(mu, sigma)
正态分布。mu是平均值,sigma是标准差
# 在3.11版本中添加了mu和sigma的默认值0.0和1.0
20. vonmisesvariate(mu, kappa)
冯·米塞斯分布。mu是平均角度,以弧度表示,介于0和2*pi之间,kappa是浓度参数,必须大于或等于零。如果kappa等于零,则该分布在0到2*pi的范围内减小到均匀的随机角度
21. paretovariate(alpha)
帕累托分布。alpha是形状参数
22. weibullvariate(alpha, beta)
威布尔分布。alpha是比例参数,beta是形状参数
(3)、类(替代生成器)
1. Random([seed])
该类实现了random模块所用的默认伪随机生成器
2. SystemRandom([seed])
使用os.urandom()函数的类,用从操作系统提供的源生成随机数
# 不依赖于软件状态,序列不可重现。因此seed参数和seed()方法没有效果而被忽视。getstate()和setstate()方法如果被调用则引发NotImplementedError
补充:os.urandom(size)
返回大小为size的字符串,它是适合加密使用的随机字节
此函数从系统指定的随机源获取随机字节。对于加密应用程序,返回的数据应有足够的不可预测性,尽管其确切的品质取决于操作系统的实现
在Windows上将使用CryptGenRandom() # C++的函数
示例:
运行结果: # 其中一次运行结果
0.13436424411240122 0.9560342718892494 0.5098685665328395
# r3随机出来的值是不固定的
二、math——数学函数
(1)、概述
math内置模块为浮点运算提供了对底层C函数库的访问
(2)、函数
# 这些函数不适用于复数,计算复数请使用cmath模块中的同名函数
# 下面函数除非另有说明,否则所有返回值均为浮点数
1. ceil(x)
返回x的向上取整,即大于或等于x的最小整数。如果x不是浮点数,委托给x.__ceil__(),它应该返回一个Integral(通常为int)的值
2. floor(x)
返回x的向下取整,即小于或等于x的最大整数。如果x不是浮点数,委托给x.__floor__(),它应该返回一个Integral(通常为int)的值
# ceil()和floor()的返回值都是整数
3. comb(n, k)
返回不重复且无顺序地从n项中选择k项的方式总数。返回值是一个整数
当k <= n时取值为n! / (k! * (n - k)!);当k > n时取值为零
也叫二项式系数,因为它相当于(1 + x)的n次方的多项式展开中第k项的系数
如果任一参数不为整数则会引发TypeError,为负数则会引发ValueError
4. perm(n, k=None)
返回不重复且有顺序地从n项中选择k项的方式总数。返回值是一个整数
当 k <= n 时取值为n! / (n - k)!;当k > n时取值为零
如果k未指定或为None,则k的默认值为n并且函数将返回n!
如果任一参数不为整数则会引发TypeError,为负数则会引发ValueError
5. factorial(x)
以整数形式返回x的阶乘。如果x不是整数或为负数则引发ValueError
# 在3.9版本后接受具有整数值的浮点数(像5.0)的行为已被弃用
示例:
运行结果:
3
2
10
60
120
6. copysign(x, y)
返回一个基于x的绝对值和y的符号的浮点数
7. fabs(x)
返回x的绝对值
# 与内置函数abs()的区别是返回值是浮点数
8. fmod(x, y)
返回x除以y的余数
# 与x % y的区别是返回值是浮点数。此函数在使用浮点数时通常是首选
9. frexp(x)
以(m, e)对的形式返回x的尾数和指数
m是一个浮点数,e是一个整数,正好是x == m * 2**e
如果x为零,则返回(0.0, 0),否则0.5 <= abs(m) < 1
这用于以可移植方式“分离”浮点数的内部表示
补充:浮点数
浮点数是值用符号、尾数、基数和指数四部分表示的小数
因为计算机内部使用二进制数,所以基数为2
10. fsum(iterable)
返回可迭代对象iterable中数值的精确浮点和。通过跟踪多个中间部分和来避免精度损失
示例:
运行结果:
-1.0
200.0
5.0 5
(0.5, 3)
9.99999999999998 10.0
11. gcd(a, b)
返回整数a和b的最大公约数。如果a或b之一非零,则返回值是能够同时整除a和b的最大正整数。gcd(0, 0)返回0
# 在3.9版本允许任意数量的参数,且不带参数的gcd()返回0
# 在3.9版本有lcm()函数,返回给定整数参数的最小公倍数
12. isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
若a和b的值比较接近则返回True,否则返回False
此函数根据给定的绝对和相对容差确定两个值是否被认为是接近的
没发生错误的情况下,结果是:abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
rel_tol——相对容差。它是a和b之间允许的最大差值,相对于a或b的较大绝对值。例如,值0.05意味着设置5%的容差。默认容差为1e-09,确保两个值在大约9位十进制数字内相同。rel_tol必须大于零
abs_tol——最小绝对容差。对于接近零的比较很有用。abs_tol必须为非负数
特殊值NaN不被认为接近任何其他值,包括NaN。inf和-inf只被认为接近自己
13. isfinite(x)
如果x既不是正或负无穷大也不是NaN,则返回True,否则返回False
14. isinf(x)
如果x是正或负无穷大则返回True,否则返回False
15. isnan(x)
如果x是NaN则返回True,否则返回False
示例:
运行结果:
10
0.30000000000000004 0.3 True
True
True
False
False
True
16. modf(x)
返回x的小数和整数部分。两个结果都带有x的符号并且是浮点数
# 返回二元组:(小数, 整数)
# 对于ceil(), floor(), modf()函数,注意所有足够大的浮点数都是精确整数。Python浮点数通常不超过53位的精度,在这种情况下,任何满足abs(x) >= 2**52的浮点x都必然没有小数位(2**52=4503599627370496)
17. ldexp(x, i)
返回x * (2**i)。这基本上是frexp()函数的反函数
18. sqrt(x)
返回非负数x的平方根 # 算术平方根
# 在3.11版本使用cbrt()函数返回立方根
19. isqrt(n)
返回非负整数n的平方根,并将平方根向下取整。相当于使得a²≤n的最大整数a
关于向上取整,对于正数n,可以使用1 + isqrt(n - 1)来计算
补充:正整数相除向上取整
ceil(a / b)或(a + b - 1) // b
# 向下取整使用floor(a / b)或a // b
20. pow(x, y)
返回x的y次幂
pow(1.0, x)和pow(x, 0.0)总是返回1.0,即使x是零或NaN # 内置函数pow()通用
如果x和y都是有限的,x是负数,y不是整数,那么pow(x, y)是未定义的,并且引发ValueError
# 与内置的**和pow()的区别是参数会转换为float类型,且返回float类型
示例:
运行结果:
(0.23399999999999999, 1.0)
4503599627370496.0 (0.0, 4503599627370496.0)
(0.5, 3) 4.0
2.0
1.7320508075688772 1 2
1 2
1 2
0 2
8.0 8
21. prod(iterable, *, start=1)
计算输入的可迭代对象iterable中所有元素的积
strat——积的起始值,默认为1
当可迭代对象为空时,返回起始值。此函数特别针对数字值使用,并会拒绝非数字类型
# 实测只要可迭代对象里的元素都可以相乘就可以。如果元素都是整数则返回整数,如果元素有浮点数(或start为浮点数)则返回浮点数
22. remainder(x, y)
返回IEEE 754风格的x相对于y的余数。对于有限x和有限非零y,返回x - n*y的差,其中n是与x / y的商的精确值最接近的整数。如果x / y恰好位于两个连续整数之间,则n是最接近的偶数。余数r = remainder(x, y)因此总是满足abs(r) <= 0.5 * abs(y)
# IEEE 754:IEEE二进位浮点数算术标准
特殊情况遵循IEEE 754:对于任何有限x,remainder(x, math.inf)返回都是x;对于任何非NaN的x,remainder(x, 0)和remainder(math.inf, x)引发ValueError。如果余数运算的结果为零,则该零将具有与x相同的符号
在使用IEEE 754二进制浮点的平台上,此操作的结果始终可以完全表示:不会引入舍入错误
23. trunc(x)
返回x截断整数的部分,即返回整数部分,忽略小数部分。委托给x.__trunc__()
# 返回值是整数
示例:
运行结果:
48
aaaaaa
-1.0
2 -1
2.0 2
12
24. exp(x)
返回e的x次幂,其中e = 2.718281...是自然对数的基数。这通常比math.e ** x或pow(math.e, x)更精确
25. expm1(x)
返回e的x次幂减1。这比调用math.exp(x) - 1更精确
补充:对数(logarithm)和自然对数(Natural logarithm) # 摘抄自百度百科
在数学中,对数是求幂的逆运算
如果a的x次方等于N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作。其中,a叫做对数的底数,N叫做真数
自然对数是以常数e为底数的对数,记作lnN(N>0)
26. log(x[, base])
只传入x,返回x的自然对数(底为e)
传入x和base,返回以base为底x的对数。计算为log(x) / log(base)
27. log1p(x)
返回1+x的自然对数(底为e)。对于接近零的x计算结果更精确
28. log2(x)
返回以2为底x的对数。这通常比log(x, 2)更准确
29. log10(x)
返回以10为底x的对数。这通常比log(x, 10)更准确
示例:
运行结果:
20.085536923187668
1.0000050000069649e-05
1.0000050000166667e-05
1.0986122886681098
3.0
3.0
3.0
30. degrees(x)
将角度x从弧度转换为度数
# pi弧度等于180度,也就是1弧度等于57.2957795度
31. radians(x)
将角度x从度数转换为弧度
32. sin(x)
返回弧度x的正弦值
# 获取指定角度的正弦需要先使用radians()将其转换为弧度
33. cos(x)
返回弧度x的余弦值
34. tan(x)
返回弧度x的正切值
35. asin(x)
返回弧度x的反正弦值。结果范围在-pi/2到pi/2之间
36. acos(x)
返回弧度x的反余弦值。结果范围在0到pi之间
37. atan(x)
返回弧度x的反正切值。结果范围在-pi/2到pi/2之间
38. atan2(y, x)
以弧度为单位返回atan(y / x)。结果范围在-pi到pi之间。从原点到点(x, y)的平面矢量使该角度与正X轴成正比。atan2()两个输入点的符号都是已知的,因此它可以计算角度的正确象限
示例:
运行结果:
180.0
0.5235987755982988 0.7853981633974483
0.49999999999999994 0.7071067811865476
0.8660254037844387 0.7071067811865476
0.5773502691896257 0.9999999999999999
39. dist(p, q)
返回p与q两点之间的欧几里得距离,参数p, q以一个坐标序列(或可迭代对象)的形式给出。两个点必须具有相同的维度
大致相当于:
sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))
40. hypot(*coordinates)
返回欧几里得范数,sqrt(sum(x**2) for x in coordinates))。这是从原点到坐标给定点的向量长度
对于一个二维点(x, y),这等价于使用毕达哥拉斯定义sqrt(x*x + y*y)计算一个直角三角形的斜边
41. sinh(x), cosh(x), tanh(x)
分别是返回x的双曲正弦、余弦、正切值
42. asinh(x), acosh(x), atanh(x)
分别是返回x的反双曲正弦、余弦、正切值
43. erf(x)
返回x处的误差函数
erf()函数可用于计算传统的统计函数,如积累标准正态分布
44. erfc(x)
返回x处的互补误差函数
互补误差函数定义为1.0 - erf(x)。它用于x的大值,从其中减去一个会导致有效位数损失
45. gamma(x)
返回x处的伽马函数(Gamma函数)值
46. lgamma(x)
返回Gamma函数在x绝对值的自然对数
(3)、常量
1. pi
数学常量π=3.141592...,精确到可用精度
2. e
数学常量e=2.718281...,精确到可用精度
3. tau
数学常量τ=6.283185...,精确到可用精度。Tau是一个圆周常数,等于2π,圆的周长与半径之比
4. inf
浮点正无穷大。相当于float('inf')的输出
# 负无穷大使用-math.inf
5. nan
浮点“非数字”(NaN)值。相当于float('nan')的输出
# 由于IEEE-754标准的要求,math.nan和float('nan')不被认为等于其他数字值,包括它们自己。要检查一个数字是否等于NaN,请使用isnan()函数而不是is或==