歡迎加入 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 > 0 、beta > 0 ,返回值的範圍介於 0 和 1 之間 |
expovariate(lambd) | 指數分佈,lambd 是 1.0 除以所需的平均值,它應該是非零的 如果 lambd 爲正,則返回值的範圍爲 0 到正無窮大 如果 lambd 爲負,則返回值的範圍爲負無窮大到 0 |
gammavariate(alpha, beta) | Gamma 分佈,參數的條件是 alpha > 0 和 beta > 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