Python 中的 random 模組詳解:新手指南
更新日期: 2024 年 9 月 25 日
在 Python 編程中,隨機數 的生成是許多應用程序的重要組成部分,例如遊戲開發、模擬測試和加密等。
Python 提供了一個強大的內建模組——random,用於生成各種類型的隨機數。
對於剛開始學習 Python 的新手來說,理解並掌握 random 模組的用法,將大大拓展你的編程能力。
本文將詳細介紹 Python 中的 random 模組,包括其基本用法、常用函數和實際應用,並提供豐富的示例,幫助你在實際開發中靈活運用。
random 模組的基本概念
什麼是 random 模組?
random 模組是 Python 的標準庫之一,提供了一系列生成隨機數的函數。
這些隨機數可以是整數、浮點數,甚至是從序列中隨機選擇的元素。
為什麼需要隨機數?
隨機數在許多領域都有應用,包括但不限於:
- 遊戲開發:如骰子、撲克牌的隨機生成。
- 模擬和測試:用於生成測試數據或模擬現實情況。
- 安全和加密:生成隨機密鑰和安全令牌。
導入 random 模組
在使用 random 模組之前,需要先導入它。
import random
random 模組的常用函數
生成隨機浮點數
random()
- 功能:返回一個介於 0.0 到 1.0 之間的隨機「浮點數」。
示例:
import random
num = random.random()
print(num)
輸出:
0.6394267984578837 # 輸出結果會每次不同
uniform(a, b)
- 功能:返回一個介於 a 和 b 之間的隨機「浮點數」。
示例:
num = random.uniform(1.5, 6.5)
print(num)
輸出:
3.8926568387590883 # 輸出結果會每次不同
生成隨機整數
randint(a, b)
- 功能:返回一個介於 a 和 b 之間的隨機「整數」,包括 a 和 b。
示例:
num = random.randint(1, 10)
print(num)
輸出:
7 # 輸出結果會每次不同
randrange(start, stop[, step])
- 功能:從指定範圍內,以指定間隔返回一個隨機整數,不包含 stop。
示例:
num = random.randrange(0, 10, 2)
print(num)
輸出:
4 # 輸出結果會每次不同,可能為 0、2、4、6、8
隨機選擇元素
choice(seq)
- 功能:從非空序列(如列表、元組、字串)中隨機返回一個元素。
示例:
fruits = ['apple', 'banana', 'cherry', 'date']
fruit = random.choice(fruits)
print(fruit)
輸出:
banana # 輸出結果會每次不同
choices(population, weights=None, k=1)
- 功能:從 population 中隨機選擇 k 個元素,返回一個列表。可以設置權重(weights)。
示例:
colors = ['red', 'green', 'blue']
selected_colors = random.choices(colors, weights=[5, 1, 1], k=3)
print(selected_colors)
輸出:
['red', 'green', 'red'] # 輸出結果會每次不同,'red' 出現的機率較高
sample(population, k)
- 功能:從 population 中隨機選擇 k 個不重複的元素,返回一個列表。
示例:
numbers = list(range(1, 50))
lottery_numbers = random.sample(numbers, 6)
print(lottery_numbers)
輸出:
[7, 14, 22, 35, 42, 48] # 輸出結果會每次不同
打亂序列
shuffle(seq)
- 功能:就地打亂序列的順序。
示例:
cards = ['A', '2', '3', '4', '5']
random.shuffle(cards)
print(cards)
輸出:
['3', 'A', '5', '2', '4'] # 輸出結果會每次不同
5. 其他函數
gauss(mu, sigma)
- 功能:返回一個符合高斯分佈(正態分佈)的隨機浮點數。
示例:
num = random.gauss(0, 1)
print(num)
輸出:
-0.8261223347411677 # 輸出結果會每次不同
設置隨機種子
為什麼要設置隨機種子?
在計算機中,我們使用 隨機數生成器 來產生隨機數。然而,計算機本質上是確定性的機器,無法產生真正的隨機數。
種子(seed)是一個初始值,提供給隨機數生成器的算法。種子決定了隨機數序列的起點。
如果你在程式中設定了相同的種子,那麼每次運行時,隨機數生成器都會從同一個起點開始,按照相同的算法步驟,生成完全相同的數字序列。
雖然這些數字看起來是隨機的,但在設定相同種子的情況下,它們是可預測且一致的。
使用 seed() 函數
示例:
random.seed(42)
print(random.randint(1, 10))
print(random.randint(1, 10))
輸出:
10
1
如果再次運行這段代碼,輸出結果將保持不變。
實際應用示例
猜數字遊戲
import random
secret_number = random.randint(1, 100)
attempts = 0
print("猜數字遊戲!我選了一個 1 到 100 之間的數字。")
while True:
guess = int(input("請輸入您的猜測:"))
attempts += 1
if guess < secret_number:
print("太小了!")
elif guess > secret_number:
print("太大了!")
else:
print(f"恭喜你,猜對了!總共猜了 {attempts} 次。")
break
模擬擲骰子
import random
def roll_dice():
return random.randint(1, 6)
print(f"你擲出了 {roll_dice()} 點。")
從列表中隨機選擇學生
import random
students = ['Alice', 'Bob', 'Charlie', 'David', 'Eva']
selected_student = random.choice(students)
print(f"被選中的學生是:{selected_student}")
注意事項
1. 隨機性和安全性
- random 模組適用於一般的隨機需求,如遊戲和模擬。
- 不適用於安全相關的隨機數生成,如加密密鑰。
- 對於安全相關的用途,請使用 secrets 模組。
示例:
import secrets
secure_number = secrets.randbelow(100)
print(secure_number)
效能考量
- 大量隨機數生成:在需要生成大量隨機數的情況下,可以考慮使用第三方庫,如 NumPy。
常見錯誤與解決方案
IndexError: list index out of range
問題:
在使用 choice() 或 sample() 時,如果序列為空,會引發錯誤。
解決方案:
在使用前檢查序列是否為空。
items = []
if items:
selected_item = random.choice(items)
else:
print("序列為空,無法選擇。")
重複選擇元素
問題:
使用 choices() 時,可能會出現重複元素。
解決方案:
如果不希望有重複元素,使用 sample()。
結論
Python 的 random 模組提供了豐富的隨機數生成函數,能夠滿足大多數應用的需求。
透過掌握這些函數的用法,你可以輕鬆地在程式中引入隨機性,從而增加趣味性和實用性。
建議:
- 多加練習:嘗試編寫一些小遊戲或模擬程式。
- 閱讀官方文檔:深入了解每個函數的參數和行為。
- 注意安全性:在需要安全隨機數的情況下,使用專門的模組。