random.seed(a=None, version=2) 初始化偽隨機數產生器的內部狀態。相同種子產生完全相同的隨機序列,這對除錯、測試、模擬重現、機器學習實驗追蹤至關重要。本文說明語法、參數、版本差異、最佳實踐與常見誤區。
函數簽名
import random
random.seed(a=None, version=2)
# a: 種子值 (None/整數/字串/bytes/bytearray),None 表示使用系統時間/熵源
# version: 1 或 2,字串/bytes 種子的雜湊演算法版本(3.2+ 預設 2)
基本範例
import random
random.seed(10)
print(random.random()) # 0.5714025946899135
print(random.random()) # 0.4288890546751146
# 重置相同種子,序列重現
random.seed(10)
print(random.random()) # 0.5714025946899135 (相同)
種子類型與版本
| 類型 | version=1 (舊) | version=2 (預設, 3.2+) |
| None | 系統時間/os.urandom | 同上 |
| int | 直接使用 | 直接使用 |
| str/bytes/bytearray | 雜湊後取整數 | 改用 SHA-512 再取整數,分佈更均勻 |
獨立 Random 實例(推薦做法)
# 全域 seed 影響所有呼叫 random.xxx() 的代碼,含第三方庫
random.seed(42)
# 區域獨立產生器,互不干擾
rng = random.Random(123)
print(rng.random())
print(rng.randint(1, 100))
# 執行緒區域
import threading
thread_local = threading.local()
def get_rng():
if not hasattr(thread_local, 'rng'):
thread_local.rng = random.Random() # 各自預設種子
return thread_local.rng
常見應用場景
- 單元測試固定輸入:
@pytest.fixture def rng(): return random.Random(42)
- 模擬實驗可重現:蒙地卡羅、隨機森林、強化學習環境。
- 分散式系統一致性:相同種子 + 相同演算法 = 相同決策(如分片路由、一致性雜湊)。
- 遊戲存檔/回放:儲存種子而非完整隨機序列,載入時重放。
密碼學安全種子
import secrets, random
# 使用 OS 熵源作為種子(不可重現,但不可預測)
random.seed(secrets.token_bytes(32))
# 或直接用 secrets.SystemRandom() 實例
secure_rng = random.SystemRandom()
print(secure_rng.random())
常見誤區
- 以為 seed() 回傳種子 → 回傳
None。
- 在迴圈中重複呼叫 seed():
for i in range(10): random.seed(); print(random.random()) 若迴圈極快,系統時間未變,種子相同,產生相同數字。正確做法:程式啟動時呼叫一次 或 完全不呼叫(預設自動種子)。
- 跨 Python 版本/實作期望相同序列:Mersenne Twister 為標準,但字串種子 version 1/2 差異、PyPy/微型 Python 可能不同。僅在同版本同環境保證重現。
- 以為 seed 影響 secrets/os.urandom → 不影響,它們直接讀取 OS 熵池。
效能
- 種子設定為 O(1),極快。
- 頻繁重設種子會破壞隨機序列的統計特性,嚴禁。
正確使用 random.seed():啟動時設一次(或不設)、測試/模擬用獨立 Random 實例、安全場景改用 secrets,即可兼顧可重現性與統計品質。
- 上一篇文章: Python random.random() 函數教學:產生 0.0 到 1.0 之間隨機浮點數
- 下一篇文章: Python 從 URL 提取檔名:os.path.basename 與 urllib.parse 完整比較
Copyright ©
程式碼之家 All Rights Reserved