Python模塊random, math
〇、前言
本系列(指Python Moudules系列)每篇介紹一個或多個內容沒有特別多模塊
模塊介紹依賴官方文檔(https://docs.python.org/zh-cn/3.8/library/index.html)或其他第三方官方文檔,主要是對其內容的補充和拓展
內容大部分來源官方文檔,少部分來源網絡。太過深奧的內容會只寫出不介紹,或省略,或省略掉太過深奧的部分(例如省略部分參數),或通過補充介紹(補充介紹的前面通常會有參考網址)
注意內容非常依賴編號。內容中類的展示方式是"編號<數字>."表示類的構造方法(__init__),"編號<數字>.<數字>"表示類的方法或屬性,方法一般是實例方法,其他方法會在前面?zhèn)渥?,屬性一般是實例屬性,類屬性會在后面?zhèn)渥?。如果構造方法無需傳參會直接展示類名
使用Python版本3.8,但也會補充高版本的修改和添加內容。系統(tǒng)Windows 7
系列WPS筆記及其他內容的百度網盤鏈接:
https://pan.baidu.com/s/1fTwjyoM81_OOAccPNhGE9Q?pwd=h3fg
顏色代表含義:
淡灰色:注釋,一般前面有#
綠色:示例
橙色:拓展
紫色:示例中的input用戶輸入內容
紅色、藍色:突出或裝飾文字作用
部分內容可能不嚴謹或者錯誤,歡迎指出

一、random——生成偽隨機數
(1)、概述
random內置模塊實現(xiàn)了各種分布的偽隨機數生成器。此模塊的偽隨機生成器不應用于安全目的,有關安全性或加密用途參閱secrets模塊
(2)、函數
# 這個模塊提供的函數實際上是random.Random類的隱藏實例的綁定方法,所以在Pychram的補全代碼中顯示的不是函數標識
1.?seed(a=None)
初始化隨機數生成器
a必須是NoneType、int、float、str、bytes或bytearray類型作為隨機數生成的種子,被省略或為None的情況下,則使用當前系統(tǒng)時間。如果操作系統(tǒng)提供隨機源,則使用它們(如果可用)
# None是NoneType類型的唯一實例
2.?random()
返回半開半閉區(qū)間[0.0, 1.0)范圍內的下一個隨機浮點數
# 幾乎所有模塊函數都依賴于此函數
3.?getstate()
返回捕獲生成器當前內部狀態(tài)的對象。這個對象可以傳遞給setstate()來恢復狀態(tài)
4.?setstate(state)
將生成器的內部狀態(tài)恢復到調用getstate()獲得狀態(tài)對象state時的狀態(tài)
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為空,則引發(fā)IndexError
7.?choices(population, weights=None, *, cum_weights=None, k=1)
從population中有重復地隨機選取元素,返回大小為k的元素列表。如果population為空,則引發(fā)IndexError
weights——是一個序列,如果指定則根據相對權重進行選擇
cum_weights——是一個序列,如果指定則根據累積權重進行選擇
# 關于累積權重,例如相對權重[10, 5, 30, 5]相當于累積權重[10, 15, 45 ,50],10為相對權重的第一個元素,15為第一個元素加第二個元素,以此類推
在內部,相對權重在進行選擇之前會轉換為累積權重,因此提供累積權重可以節(jié)省工作量
如果既未指定weights也未指定cum_weights,則以相等的概率進行選擇;如果既指定weights也指定cum_weights,則引發(fā)TypeError
如果提供了權重序列(weights或cum_weights),則它必須與population序列的長度相同。權重值可使用random()鎖返回的能與float值進行互相運算的任何數字類型(包括整數、浮點數、分數但不包括decimal)。權重值應當非負且為有限的數值
# 有限的數值指不是inf、-inf之類的數值
# 在高版本Python中,權重值的和必須大于零,否則引發(fā)ValueError異常,而在Python3.8中不會,權重值應當為非負數且總和大于零
對于給定的種子,具有相等加權的choices()函數通常產生與重復調用choice()不同的序列。choices()使用的算法使用浮點運算來實現(xiàn)內部一致性和速度。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()對象作為參。對于從大量人群中采樣,這種方法特別迅速且節(jié)省空間,例如sample(range(10000000), k=60)
如果樣本大小k大于總體大小len(population),則引發(fā)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的繪圖庫,它能讓使用者很輕松地將數據圖形化,并且提供多樣化的輸出格式,可以用來繪制各種靜態(tài),動態(tài),交互式的圖表
下面將會使用這個模塊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)
正態(tài)分布,也稱高斯分布。mu為平均值,而sigma為標準差。此函數要稍快于下面所定義的normalvariate()函數
# 多線程需要注意當兩個線程同時調用此方法時,它們有可能獲得相同的返回值??赏ㄟ^三種辦法來避免。1)讓每個線程使用不同的隨機數生成器實例。2)在所有調用外面加鎖。3)改用速度較慢但是線程安全的normalvariate()函數
# 在3.11版本中添加了mu和sigma的默認值0.0和1.0
18.?lognormvariate(mu, sigma)
對數正態(tài)分布。如果你采用這個分布的自然對數,你將得到一個正態(tài)分布,平均值為mu和標準差為 sigma。mu可以是任何值,sigma必須大于零
19.?normalvariate(mu, sigma)
正態(tài)分布。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])
該類實現(xiàn)了random模塊所用的默認偽隨機生成器
2.?SystemRandom([seed])
使用os.urandom()函數的類,用從操作系統(tǒng)提供的源生成隨機數
# 不依賴于軟件狀態(tài),序列不可重現(xiàn)。因此seed參數和seed()方法沒有效果而被忽視。getstate()和setstate()方法如果被調用則引發(fā)NotImplementedError
補充:os.urandom(size)
返回大小為size的字符串,它是適合加密使用的隨機字節(jié)
此函數從系統(tǒng)指定的隨機源獲取隨機字節(jié)。對于加密應用程序,返回的數據應有足夠的不可預測性,盡管其確切的品質取決于操作系統(tǒng)的實現(xiàn)
在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項的系數
如果任一參數不為整數則會引發(fā)TypeError,為負數則會引發(fā)ValueError
4.?perm(n, k=None)
返回不重復且有順序地從n項中選擇k項的方式總數。返回值是一個整數
當 k <= n 時取值為n! / (n - k)!;當k > n時取值為零
如果k未指定或為None,則k的默認值為n并且函數將返回n!
如果任一參數不為整數則會引發(fā)TypeError,為負數則會引發(fā)ValueError
5.?factorial(x)
以整數形式返回x的階乘。如果x不是整數或為負數則引發(fā)ValueError
# 在3.9版本后接受具有整數值的浮點數(像5.0)的行為已被棄用
示例:
運行結果:
3
2
10
60
120
6.?copysign(x, y)
返回一個基于x的絕對值和y的符號的浮點數
7.?fabs(x)
返回x的絕對值
# 與內置函數abs()的區(qū)別是返回值是浮點數
8.?fmod(x, y)
返回x除以y的余數
# 與x % y的區(qū)別是返回值是浮點數。此函數在使用浮點數時通常是首選
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版本有l(wèi)cm()函數,返回給定整數參數的最小公倍數
12.?isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
若a和b的值比較接近則返回True,否則返回False
此函數根據給定的絕對和相對容差確定兩個值是否被認為是接近的
沒發(fā)生錯誤的情況下,結果是: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的平方根,并將平方根向下取整。相當于使得a2≤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)是未定義的,并且引發(fā)ValueError
# 與內置的**和pow()的區(qū)別是參數會轉換為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恰好位于兩個連續(xù)整數之間,則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)引發(fā)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()函數可用于計算傳統(tǒng)的統(tǒng)計函數,如積累標準正態(tài)分布
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或==