介紹如何使用 Python 內建的 random
模組產生各種亂數,以及進行隨機抽樣或排序等。
Python 內建的
random
模組可以用來產生隨機亂數,以下是各種亂數的產生方式與範例。
若要使用 Python 的 random
模組,直接引入即可,不必安裝:
# 引入 random 模組 import random
產生隨機亂數(浮點數)
random
函數可以產生介於 0
到 1
之間隨機浮點數:
# 產生介於 0 到 1 之間的隨機浮點數(0.0 <= x < 1.0) x = random.random() print(x)
0.20380693821340268
若要改變隨機浮點數的數值範圍,可以使用 uniform
函數,它可以透過參數指定亂數的下限與上限值:
# 產生介於 2.5 到 10 之間的隨機浮點數(2.5 <= x < 10.0) x = random.uniform(2.5, 10.0) print(x)
7.662203326329259
產生隨機亂數(整數)
若要產生固定範圍內的隨機整數,可以使用 randrange
,其範圍的指定方式類似 range
,可以用單一參數指定範圍上限值,下限值預設為 0
。例如產生介於 0
到 4
之間的隨機整數:
# 產生介於 0 到 4 的隨機整數(0 <= x < 5) x = random.randrange(5) print(x)
3
當下限值不是 0
的時候,則可用兩個參數分別指定上限與下限值,例如產生介於 5
到 9
的隨機整數:
# 產生介於 5 到 9 的隨機整數(5 <= x < 10) x = random.randrange(5, 10) print(x)
8
randrange
可以透過第三個參數指定步長(step),可用於產生奇數或偶數等亂數:
# 產生介於 0 到 100 的隨機偶數(0 <= x < 101) x = random.randrange(0, 101, 2) print(x)
12
設定亂數種子
電腦所產生的亂數實際上是根據亂數種子與演算法計算出來的,同樣的亂數種子會產生相同的亂數。若要設定亂數種子可以使用 seed
函數:
# 設定亂數種子 random.seed(10) # 產生亂數 print(random.random())
0.5714025946899135
亂數種子在驗證程式的正確性時非常重要,在程式的開發與除錯階段,通常都需要固定亂數種子,這樣才能比較容易看出程式有沒有問題。
隨機抽取串列元素
如果要從一個串列(list)中隨機抽取一個元素(隨機抽樣),可以使用 choice
函數:
# 串列資料 a = ["A", "B", "C", "D"] # 隨機抽取一個元素 x = random.choice(a) print(x)
B
如果要抽取多個元素,而且取後不放回,則可使用 sample
函數:
# 串列資料 a = ["A", "B", "C", "D"] # 隨機抽取 2 個元素(取後不放回) x = random.sample(a, 2) print(x)
['D', 'C']
如果要抽取多個元素,並且取後放回,則可使用 choices
函數:
# 串列資料 a = ["A", "B", "C", "D"] # 隨機抽取 2 個元素(取後放回) x = random.choices(a, k=2) print(x)
['D', 'B']
隨機排序串列
若要對串列進行隨機排序,把元素的順序打亂,可以使用 shuffle
函數:
# 串列資料 a = [1, 2, 3, 4, 5, 6] # 隨機排序串列 random.shuffle(a) print(a)
產生常態分布亂數
常態分布(normal distribution,又稱高斯分布)是模擬分析上很常被使用分布之一,若要產生常態分布的亂數可以使用 gauss
函數:
# 產生常態分布亂數(平均值 = 0,標準差 = 1) x = random.gauss(mu=0, sigma=1) print(x)
0.49899782617786265
以下是產生 10000
個常態分布亂數,並繪製直方圖的範例:
import random import matplotlib.pyplot as plt # 產生 10000 個常態分布亂數 nums = [] for i in range(10000): x = random.gauss(mu=0, sigma=1) nums.append(x) # 繪製直方圖 plt.hist(nums, bins=100) plt.show()
產生指數分布亂數
指數分布(exponential distribution)也是常見的分布之一,若要產生指數分布的隨機亂數,可以使用 函數:
# 產生指數分布亂數(平均值 = 1/5) x = random.expovariate(lambd=5) print(x)
0.15457600767292332
以下是產生 10000
個指數分布亂數,並繪製直方圖的範例:
import random import matplotlib.pyplot as plt # 產生 10000 個指數分布亂數 nums = [] for i in range(10000): x = random.expovariate(lambd=5) nums.append(x) # 繪製直方圖 plt.hist(nums, bins=100) plt.show()
其他分布亂數
random
模組還可以產生其他不同分布的隨機亂數,對應的函數如下:
gammavariate(alpha, beta)
:伽瑪分布(Gamma distribution)。betavariate(alpha, beta)
:Β分布(Beta distribution)。triangular(low, high, mode)
:三角形分布(triangular distribution)。
詳細的說明可參考 random
模組的官方說明文件。