【Python 標準庫解讀】僞隨機數生成庫 — random

歡迎加入 Python 官方文檔翻譯團隊:https://www.transifex.com/python-doc/


隨機函數在很多科學計算中都會用到,比如生成一系列隨機數來計算平均值、高斯分佈、伽馬分佈、貝塔分佈、對數正態分佈等。

幾乎所有模塊函數都依賴於基本函數 random() ,它在半開放區間 [0.0,1.0) 內均勻生成隨機浮點數。 Python 使用 Mersenne Twister 作爲核心生成器。 它產生 53 位精度浮點數,週期爲 219937-1 ,其在 C 中的底層實現既快又線程安全。 Mersenne Twister 是現存最廣泛測試的隨機數發生器之一。 但是,因爲完全確定性,它不適用於所有目的,並且完全不適合加密目的。

random 模塊官方文檔:https://docs.python.org/3/library/random.html

random 模塊部分常用函數:

函數 功能
random() 返回一個在 [0.0, 1.0) 範圍內的隨機浮點數
uniform(a, b) 在指定範圍 [a, b] 內返回一個隨機浮點數
randint(a, b) 在指定範圍 [a, b] 內返回一個隨機整數
choice(seq) 從非空序列 seq 中返回一個隨機元素
sample(population, k) 返回在多個字符中(population)生成指定數量(k)的隨機字符
randrange(start, stop[, step]) 在指定範圍(start, stop) 內返回一個間隔爲 step 的隨機整數,step 爲可選參數
shuffle(x) 將序列 x 隨機打亂位置
triangular(low, high, mode) 返回三角形分佈的隨機數,low、high 爲返回值的上下限,mode 爲中值
betavariate(alpha, beta) 求 Beta 分佈的隨機數,其中 alpha > 0beta > 0,返回值的範圍介於 0 和 1 之間
expovariate(lambd) 指數分佈,lambd 是 1.0 除以所需的平均值,它應該是非零的
如果 lambd 爲正,則返回值的範圍爲 0 到正無窮大
如果 lambd 爲負,則返回值的範圍爲負無窮大到 0
gammavariate(alpha, beta) Gamma 分佈,參數的條件是 alpha > 0beta > 0
gauss(mu, sigma) 高斯分佈,mu 是平均值,sigma 是標準差
lognormvariate(mu, sigma) 對數正態分佈,mu 是平均值,sigma 是標準差,mu 可以是任何值,sigma 必須大於零
normalvariate(mu, sigma) 正態分佈,mu 是平均值,sigma 是標準差
vonmisesvariate(mu, kappa) 馮·米塞斯分佈(von Mises),mu 是平均角度,以弧度表示,介於 0 和 2 * pi 之間
kappa 是濃度參數,必須大於或等於零
如果 kappa 等於零,則該分佈在 0 到 2 * pi 的範圍內減小到均勻的隨機角度
paretovariate(alpha) 帕累託分佈,alpha 是形狀參數
weibullvariate(alpha, beta) 威布爾分佈,alpha 是比例參數,beta 是形狀參數

常見函數應用舉例:

random.random()

生成一個在 0.0 <= x < 1.0 之間的浮點數

>>> import random      # 導入 random 模塊
>>> random.random()    # 調用 random() 方法
0.7811493181713127     # 隨機生成一個大於等於 0,小於 1 的浮點數

random.uniform(a, b)

在指定範圍 [a, b] 內獲取隨機浮點數

>>> import random
>>> random.uniform(-5, 5)
-4.117969777026395
>>> random.uniform(-10, -5)
-8.257739458506384
>>> random.uniform(1.8, 9.2)
8.129467781976114

random.randint(a, b)

在指定範圍 [a, b] 內獲取隨機整數

>>> import random
>>> random.randint(1, 20)
8

random.choice(seq)

從非空序列 seq 中返回一個隨機元素

>>> import random
>>> random.choice('tomorrow')
'o'
>>> random.choice(['python', 'c++', 'java'])
'java'

random.sample(population, k)

返回在多個字符中(population)生成指定數量(k)的隨機字符

>>> import random
>>> random.sample('dsabkl2498sjdsa8asd7f0',5)
['f', '2', 'a', 's', 's']

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

在指定範圍內 (start, stop) 返回一個間隔爲 step 的隨機整數,step 爲可選參數

>>> import random
>>> print(random.randrange(0, 10, 5))
5
>>> print(random.randrange(0, 11, 5))
10
>>> print(random.randrange(0, 10))
7

random.shuffle(x)

將序列 x 隨機打亂位置

>>> a = [1, 2, 3, 4, 5]
>>> random.shuffle(a)
>>> a
[2, 5, 4, 1, 3]

random.triangular(low, high, mode)

返回三角形分佈的隨機數,返回的隨機浮點數 N 滿足 low <= N <= high,並且在這些邊界之間指定 mode,low 和 high 默認值爲 0 和 1,mode 參數默認爲邊界之間的中點,持續使用該函數,可以得到以 mode 爲對稱點的隨機分佈數據集(在圖上體現爲一個三角形分佈)

>>> import random
>>> random.triangular()
0.3604089623206311
>>> random.triangular(0,10)
7.215758147092778
>>> random.triangular(0,10,15)
10.965963151355984

random.betavariate(alpha, beta)

求 Beta 分佈,參數條件:alpha > 0,beta > 0,返回值介於 0 ~ 1 之間

>>> import random
>>> random.betavariate(4, 9)
0.13445358577865857
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章