隨機數在計算機科學領域扮演著重要的角色,用于模擬真實世界的隨機性、數據生成、密碼學等多個領域。Python 中的 random 模塊提供了豐富的隨機數生成功能,本文整理了 random 模塊的使用。
文章目錄
- Python random 模塊
- 注意事項
- Python random 模塊的內置函數
- randint()
- randrange()
- random()
- uniform()
- gauss(mu, sigma)
- sample()
- choice(sequence)
- shuffle(sequence)
- seed(a=None)
Python random 模塊
注意事項
-
偽隨機性:Python 使用 random 模塊生成各種分布的偽隨機數。計算機生成的隨機數都是偽隨機數,它們是由確定性算法生成的,只是看起來像隨機。如果需要高度的隨機性,需要額外的隨機源。
-
不同類型的隨機性:在模擬、密碼學等場景中,需要注意不同類型的隨機性需求。如果前往 Python 文檔以獲取此模塊的文檔,將會看到一條警告:
顯然,random 模塊只適用于一般的隨機數需求。random 模塊使用 Mersenne Twister 算法來生成隨機數。但是這種算法是完全確定性的,而對于密碼學等需要高強度隨機性的場景,應該使用 secrets 模塊。
Python random 模塊的內置函數
下面是 random 模塊下的各種內置函數。這些函數能夠在不同場景下生成偽隨機數:
下面的列表包含了上述隨機數生成函數的簡要說明:
函數名 | 描述 |
---|---|
randint(a, b) | 生成一個位于 [a, b] 范圍內的隨機整數 |
randrange(start, stop, step) | 生成一個以 step 遞增的整數序列中的隨機元素 |
random() | 生成一個位于 [0.0, 1.0) 范圍內的隨機浮點數 |
uniform(a, b) | 生成一個位于 [a, b) 范圍內的隨機浮點數 |
gauss(mu, sigma) | 生成一個符合高斯分布的隨機浮點數,均值為 mu ,標準差為 sigma |
sample(population, k) | 從 population 序列中隨機選擇 k 個元素,不重復 |
choice(sequence) | 從序列中隨機選擇一個元素 |
shuffle(sequence) | 隨機打亂序列中的元素順序 |
seed(a=None) | 初始化隨機數生成器的種子,用于重現隨機序列 |
下面是這些函數的更詳細介紹及示例。
randint()
此函數生成指定范圍之間的整數。它接受兩個參數 x x x 和 y y y 并生成整數 i i i,使得 x < = i < = y x <= i <= y x<=i<=y。
import randoma = random.randint(3, 6)
print(a) # 輸出:3
randrange()
該函數生成一個以 step
為步長的整數序列中的隨機元素。start
和 stop
是范圍,取值范圍是 [start, stop)
。若省略 step
參數,默認為 1。
import randoma = random.randrange(1, 10, 2)
print(a) # 輸出:7
random()
該函數生成一個位于 [0.0, 1.0)
范圍內的隨機浮點數。所有數字在這個范圍內的概率是相等的。
import randoma = random.random()
print(a) # 輸出:0.6427979778735594
uniform()
該函數生成一個位于 [a, b)
范圍內的隨機浮點數。類似于random()
,但可以指定范圍。
import randoma = random.uniform(3, 6)
print(a) # 輸出:3.512451152441262
gauss(mu, sigma)
該函數生成一個符合高斯分布(也稱為正態分布)的隨機浮點數。mu
是均值,sigma
是標準差,控制分布的形狀。
import randoma = random.gauss(3, 0.5)
print(a) # 輸出:2.9743970359818612
sample()
如果想要一個序列中的多個隨機元素,可以使用 sample()
。它需要兩個參數 population
和 k
,其中 population
是一個序列,k
是一個整數。然后,該函數從 population
序列中隨機選擇 k
個元素,并以列表形式返回。選擇不重復。
import randomseq = (12, 33, 67, 55, 78, 90, 34, 67, 88)
a = random.sample(seq, 5)
print(a) # 輸出:[88, 78, 67, 34, 33]
choice(sequence)
如果要從特定序列中選擇隨機元素,可以使用此函數。它需要一個參數——sequence
。它從序列中返回一個隨機元素。
import randomseq = (12, 33, 67, 55, 78, 90, 34, 67, 88)
a = random.choice(seq)
print(a) # 輸出:88
注意:
random.choice(seq)
不等同于random.sample(seq, 1)
,前者返回元素,后者返回列表。
shuffle(sequence)
此函數采用一個參數 —— 列表。然后,它會將列表的元素打亂并返回。
import randoma = [10, 20, 30, 40, 50]
random.shuffle(a)
print(a) # 輸出:[30, 10, 20, 40, 50]
seed(a=None)
當需要多次生成相同的隨機數序列時,可以使用此函數。它需要一個參數 —— 種子值。此值初始化偽隨機數生成器。每當使用相同的種子值調用 seed()
函數時,它都會產生完全相同的隨機數序列,這對于需要重現隨機結果的情況很有用。
import random
# seed value = 3
random.seed(3)
for i in range(3):print(random.random(), end = ' ')print('\n')# seed value = 8
random.seed(8)
for i in range(3):print(random.random(), end = ' ')print('\n')# seed value again = 3
random.seed(3)
for i in range(3):print(random.random(), end = ' ')print('\n')
輸出:
0.23796462709189137 0.5442292252959519 0.369955166548079250.2267058593810488 0.9622950358343828 0.12633089865085956
0.23796462709189137 0.5442292252959519 0.36995516654807925
可以看出,對于種子 = 3,每次都會生成相同的序列。