Python的random模塊

在日常生活中,隨機數(shù)我們很多時候都會經(jīng)常接觸到,比如說游戲抽卡,隨機到的數(shù)值就可以決定這波抽卡的結(jié)果是歐皇附體、正常水平還是直接吃井(保底)。正如其它編程語言一樣,Python也有生成隨機數(shù)的功能,其中有一個很重要的模塊即是random,為了加深記憶,這篇文章記錄一下該模塊的一些主要的函數(shù)及其功能。

注:Random模塊生成的隨機數(shù)并不具備加密安全性,因此不能用于生成加密算法中所需的隨機數(shù)。此時應(yīng)當使用secrets模塊(其適用于Python 3.6及其之后版本),其生成的隨機數(shù)具有高加密強度。(小于3.6的話可使用os.urandom()方法和random.SystemRandom類)

1. 導(dǎo)入模塊

導(dǎo)入模塊很簡單,在代碼開頭導(dǎo)入random包即可(或者使用from語句導(dǎo)入random包中特定函數(shù))。

import random

2. 常見函數(shù)

2.1 設(shè)定種子

random.seed(a=None)

該函數(shù)用于初始化隨機數(shù)生成器,參數(shù)a為選定的隨機種子,其可以為NoneType,int,float,str,bytes和bytearray類型。

如果沒有給定種子的話,Python默認使用當前系統(tǒng)時間作為種子。

隨機種子的作用

計算機生成的隨機數(shù)一般都是偽隨機數(shù),并不能做到真正的隨機。它們主要使用特定的隨機數(shù)生成算法來進行生成,像Python主要使用的隨機數(shù)生成算法是梅森旋轉(zhuǎn)算法(Mersenne twister)。而種子的作用主要是作為生成隨機數(shù)的函數(shù)的初始輸入,而對于相同的種子,在單線程情況下,無論跑多少次,隨機數(shù)生成算法生成的數(shù)字是完全相同的,這也是為什么被稱之為偽隨機的原因。而計算機默認情況下使用系統(tǒng)時間也是因為可以保證每次生成隨機數(shù)的時候種子是不同的。

>>> random.seed(1)
>>> random.random()
0.13436424411240122
>>> random.seed(1)
>>> random.random()
0.13436424411240122

2.2 選取隨機整數(shù)

random.randrange ([start,] stop [,step])

從 range(start, stop, step) 返回一個隨機選擇的元素,類似于 choice(range(start, stop, step)) ,但實際上并沒有構(gòu)建一個 range 對象。(官方文檔解釋)

該函數(shù)返回一個[start,stop)范圍內(nèi)的隨機整數(shù),start和step可以省略。start的默認值為0, step默認值為1。

random.randint(a, b)

隨機返回一個[a,b]范圍內(nèi)的整數(shù)N(a<=N<=b),其等價于random.randrange(a, b+1)

注:randrange是左閉右開的,而randint兩邊都是閉區(qū)間

2.3 從序列中隨機選取元素/子序列

random.choice(seq)

從序列中隨機選取一個元素,若序列為空,則報IndexError錯誤

random.choices(population, weights=None, *, cum_weights=None, k=1)

從序列中有放回地隨機抽取k個元素,并返回對應(yīng)的數(shù)組,weights參數(shù)代表每個元素被選到的相對權(quán)重,而cum_weights代表的是累積權(quán)重,它們的長度需和待抽取序列population長度一致。若無設(shè)置權(quán)重,則每個元素被抽到的權(quán)重是一樣的。

注:權(quán)重不能為負值,否則會報錯

>>> a = ['alice', 'bob', 'helen', 'jack', 'sue']
>>> random.choices(a, weights = [3,1,2,1,5], k=4)
['helen', 'helen', 'sue', 'helen']
random.sample(population, k, *, counts=None)

從序列中無放回地隨機抽取k個元素。

>>> a = ['alice', 'bob', 'helen', 'jack', 'sue']
>>> random.sample(a,3)
['sue', 'jack', 'bob']

2.4 隨機打亂序列

random.shuffle(x[, random])

隨機打亂序列,可選參數(shù)random為特定的無參數(shù)的生成隨機數(shù)的函數(shù),默認為random()
該函數(shù)會直接改變序列的值,若需返回一個新的隨機打亂序列,可使用random.sample(x,len(x))

>>> a = ['alice', 'bob', 'helen', 'jack', 'sue']
>>> random.shuffle(a)
>>> a
['jack', 'bob', 'alice', 'helen', 'sue']

2.5 產(chǎn)生符合特定分布的隨機浮點數(shù)

random.random()

返回 [0.0, 1.0) 范圍內(nèi)的下一個隨機浮點數(shù)。

random.uniform(a, b)

返回一個隨機浮點數(shù)N,當a<=b時a<=N<=b,當b<a時b<=N<=a。

取決于等式 a+(b-a)*random() 中的浮點舍入,終點b可以包括或不包括在該范圍內(nèi)。(官方文檔解釋)

即生成一個符合在Uniform均勻分布區(qū)間內(nèi)的浮點數(shù)。

除了以上兩種之外,random也可以生成符合gauss分布,gamma分布,正態(tài)分布,指數(shù)分布等的隨機數(shù),它們也有特定的生成函數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容