1. 程式人生 > 程式設計 >python隨機模組random的22種函式(小結)

python隨機模組random的22種函式(小結)

前言

  隨機數可以用於數學,遊戲,安全等領域中,還經常被嵌入到演算法中,用以提高演算法效率,並提高程式的安全性。平時資料分析各種分佈的資料構造也會用到。

  random模組,用於生成偽隨機數,之所以稱之為偽隨機數,是因為真正意義上的隨機數(或者隨機事件)在某次產生過程中是按照實驗過程中表現的分佈概率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函式是按照一定演算法模擬產生的,對於正常隨機而言,會出現某個事情出現多次的情況。

  但是偽隨機在事情觸發前設定好,就是這個十個事件各發生一次,只不過順序不同而已。現在MP3的隨機列表就是用的偽隨機,把要播放的歌曲打亂順序,生成一個隨機列表而已,每個歌曲都播放一次。真實隨機的話,會有出現某首歌多放次的情況,歌曲基數越多,重放的概率越大。

注意:random()是不能直接訪問的,需要匯入 random 模組,然後通過 random 靜態物件呼叫該方法。

import random
list(dir(random))
['BPF','LOG4','NV_MAGICCONST','RECIP_BPF','Random','SG_MAGICCONST','SystemRandom','TWOPI','betavariate','choice','choices','expovariate','gammavariate','gauss','getrandbits','getstate','lognormvariate','normalvariate','paretovariate','randint','random','randrange','sample','seed','setstate','shuffle','triangular','uniform','vonmisesvariate','weibullvariate']

#載入所需要的包
import random
import matplotlib.pyplot as plt
import seaborn as sns

random.random()

描述:random.random() 用於生成一個0到1的隨機符點數: 0 <= n < 1.0
語法:random.random()

#生成一個隨機數
random.random()
0.7186311708109537

#生成一個4位小數的隨機列表
[round(random.random(),4) for i in range(10)]
[0.1693,0.4698,0.5849,0.6859,0.2818,0.216,0.1976,0.3171,0.2522,0.8012]

#生成一串隨機數
for i in range(10):
print(random.random())
0.4386055639247348
0.4394437853977078
0.231862963682833
0.6483168963553342
0.12106581255811855
0.7043874986531355
0.38729519658498623
0.6492256157170393
0.463425050933564
0.2298431522075462

random.choice()

描述:從非空序列seq中隨機選取一個元素。如果seq為空則彈出 IndexError異常。
語法:random.choice( seq)seq 可以是一個列表,元組或字串。

L = [0,1,2,3,4,5]
random.choice(L)
2

L = 'wofeichangshuai'
random.choice(L)
'h'

random.choices()

描述:從叢集中隨機選取k次資料,返回一個列表,可以設定權重。
注意每次選取都不會影響原序列,每一次選取都是基於原序列。也就是有放回抽樣
語法:random.choices(population,weights=None,*,cum_weights=None,k=1)
引數:

  • population:叢集。
  • weights:相對權重。
  • cum_weights:累加權重。
  • k:選取次數。
a = [1,5]
random.choices(a,k=5)
[2,5,3]

random.choices(a,weights=[0,0],k=5)
[3,weights=[1,1],2]

#多次執行,5被抽到的概率為0.5,比其他的都大
random.choices(a,weights=[0.1,0.1,0.2,0.3,0.5],k=5)
[5,2]
random.choices(a,5]

random.choices(a,cum_weights=[1,k=5)
[1,1]

對每一條語句不妨各自寫一個迴圈語句讓它輸出個十遍八遍的,你就足以看出用法了。

結論:引數weights設定相對權重,它的值是一個列表,設定之後,每一個成員被抽取到的概率就被確定了。比如weights=[1,5],那麼第一個成員的概率就是P=1/(1+2+3+4+5)=1/15。
cum_weights設定累加權重,Python會自動把相對權重轉換為累加權重,即如果你直接給出累加權重,那麼就不需要給出相對權重,且Python省略了一步執行。比如weights=[1,4],那麼cum_weights=[1,6,10],這也就不難理解為什麼cum_weights=[1,1]輸出全是第一

random.getrandbits()

描述:返回一個不大於K位的Python整數(十進位制),比如k=10,則結果在0~2^10之間的整數。
語法:random.getrandbits(k)

random.getrandbits(10)
379

random.getstate()

描述:返回一個捕獲到的 生成器當前內部狀態 的物件,可以將此物件傳遞給 setstate() 以恢復到這個狀態。
語法:random.getstate()

random.setstate()

描述:state 應該是從之前呼叫 getstate() 獲得的,而 setstate() 將生成器的內部狀態恢復到呼叫 getstate() 時的狀態。根據下面的例子可以看出,由於生成器內部狀態相同時會生成相同的下一個隨機數,我們可以使用 getstate() 和 setstate() 對生成器內部狀態進行獲取和重置到某一狀態下。
語法:random.setstate(state)

state = random.getstate()
random.random()
0.489148634943

random.random()
0.22359638172661822

random.setstate(state)
random.random()
0.48914863494

random.randint()

描述:用於生成一個指定範圍內的整數。
語法:random.randint(a,b),其中引數a是下限,引數b是上限,生成的隨機數n: a <= n <= b

random.randint(1,8)
3
random.randint(1,8)
4

random.randrange()

描述:按指定基數遞增的集合中 獲取一個隨機數。如:random.randrange(10,100,2),結果相當於從[10,12,14,16,… 96,98]序列中獲取一個隨機數,random.randrange(10,2)在結果上與 random.choice(range(10,2) 等效。
語法:random.randrange([start],stop[,step])

  • 不指定step,隨機生成[a,b)範圍內一個整數。
  • 指定step,step作為步長會進一步限制[a,b)的範圍,比如randrange(0,11,2)意即生成[0,11)範圍內的隨機偶數。
  • 不指定a,則預設從0開始。
#不限制
[random.randrange(0,11) for i in range(5)]
[4,9,5]

#隨機偶數,執行5個數
[random.randrange(0,2) for i in range(5)]
[2,8,6]

random.sample()

描述:從population樣本或集合中隨機抽取K個不重複的元素形成新的序列。常用於不重複的隨機抽樣。返回的是一個新的序列,不會破壞原有序列。要從一個整數區間隨機抽取一定數量的整數,請使用sample(range(1000000),k=60)類似的方法,這非常有效和節省空間。如果k大於population的長度,則彈出ValueError異常。
語法:random.sample(population,k)
注意:與random.choices()的區別:一個是選取k次,一個是選取k個,選取k次的相當於選取後又放回,選取k個則選取後不放回。故random.sample()的k值不能超出叢集的元素個數。

random.sample(range(1000),k=5)
[82,678,664,177,376]

L = [0,5]
random.sample(L,3)
[5,1]

random.sample(L,3)
[2,5]

random.seed()

描述:初始化偽隨機數生成器。如果未提供a或者a=None,則使用系統時間為種子。如果a是一個整數,則作為種子。偽隨機數生成模組。如果不提供 seed,預設使用系統時間。使用相同的 seed,可以獲得完全相同的隨機數序列,常用於演算法改進測試。
語法:random.seed(a=None,version=2)

# 生成一個隨機數迭代器例項,與下列的例項不共享隨機狀態
a = random.Random()
[a.randint(1,100) for i in range(20)]
[97,91,63,88,82,80,59,40,96,64,68,49,65,50,58,31,60]

b = random.Random()
[b.randint(1,100) for i in range(20)]
[46,53,89,48,21,45,26,43,85,78,38,54,27,56]

############################################################################
a = random.Random()
# 指定相同的隨機種子,共享隨機狀態
a.seed(1)
[a.randint(1,100) for i in range(20)]
[14,77,66,79,10,84,44,73,23,95,4]

b =random.Random()
# 指定相同的隨機種子,共享隨機狀態
b.seed(1)
[b.randint(1,4]

random.shuffle()

描述:用於將一個列表中的元素打亂。只能針對可變的序列,對於不可變序列,請使用下面的sample()方法。
語法:random.shuffle(x)

L = [0,5]
random.shuffle(L)
L
[5,2]

random.uniform()

描述:產生[a,b]範圍內一個隨機浮點數。uniform()的a,b引數不需要遵循a<=b的規則,即a小b大也可以,此時生成[b,a]範圍內的隨機浮點數。
語法:random.uniform(x,y)

random.uniform(10,11)
10.789198208817488

random.triangular()

描述:返回一個low <= N <=high的三角形分佈的隨機數。引數mode指明眾數出現位置。
語法:random.triangular(low,high,mode)

data = [random.triangular(2,3) for i in range(20000)]
#直方圖
plt.hist(data,bins=100,color="#FF0000",alpha=.7)
#密度圖
sns.kdeplot(data,shade=True,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.vonmisesvariate()

描述:卡帕分佈
語法:vonmisesvariate(mu,kappa)

data = [random.vonmisesvariate(2,2) for i in range(20000)]
#直方圖
plt.hist(data,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.weibullvariate()

描述:威布林分佈
語法:random.weibullvariate(alpha,beta)

data = [random.weibullvariate(1,alpha=.7)
sns.kdeplot(data,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.betavariate()

描述: β分佈
語法:random.betavariate(alpha,beta)

data = [random.betavariate(1,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.expovariate()

描述:指數分佈
語法:random.expovariate(lambd)

data = [random.expovariate(2) for i in range(50000)]
#直方圖
plt.hist(data,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.gammavariate()

描述: 伽馬分佈
語法:random.gammavariate(alpha,beta)

data = [random.gammavariate(2,2) for i in range(50000)]
#直方圖
plt.hist(data,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.gauss()

描述:高斯分佈
語法:random.gauss(mu,sigma)

data = [random.gauss(2,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.lognormvariate()

描述:對數正態分佈
語法:random.lognormvariate(mu,sigma)

data = [random.lognormvariate(4,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.normalvariate()

描述: 正態分佈
語法:random.normalvariate(mu,sigma)

data = [random.normalvariate(2,4) for i in range(20000)]
#直方圖
plt.hist(data,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

random.paretovariate()

描述:帕累託分佈
語法:random.paretovariate(alpha)

data = [random.paretovariate(4) for i in range(50000)]
#直方圖
plt.hist(data,color="#FF0000")

直方圖

python隨機模組random的22種函式(小結)

密度圖

python隨機模組random的22種函式(小結)

到此這篇關於python隨機模組random的22種函式(小結)的文章就介紹到這了,更多相關python隨機模組random內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!