欢迎光临散文网 会员登陆 & 注册

Python模块random, math

2023-07-20 17:15 作者:水母山楂  | 我要投稿

〇、前言

本系列(指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()

用于显示所有图形

示例:

运行结果:

 

红色为0.0~1.0的随机浮点数;绿色是三角形分布,偏向0.8;蓝色和黄色是beta分布


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

概率分布函数是:

pdf(x)%20%3D%20%5Cfrac%7Bx%20**%20(alpha%20-%201)%20*%20math.exp(-x%20%2F%20beta)%7D%7Bmath.gamma(alpha)%20*%20beta%20**%20alpha%7D%20

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或==

Python模块random, math的评论 (共 条)

分享到微博请遵守国家法律