首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python random.seed() 函數教學:設定隨機種子實現可重現序列

     編輯:更多程式設計知識

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 (相同)

種子類型與版本

獨立 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

常見應用場景

  1. 單元測試固定輸入:@pytest.fixture def rng(): return random.Random(42)
  2. 模擬實驗可重現:蒙地卡羅、隨機森林、強化學習環境。
  3. 分散式系統一致性:相同種子 + 相同演算法 = 相同決策(如分片路由、一致性雜湊)。
  4. 遊戲存檔/回放:儲存種子而非完整隨機序列,載入時重放。

密碼學安全種子


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,即可兼顧可重現性與統計品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類型version=1 (舊)version=2 (預設, 3.2+)
None系統時間/os.urandom同上
int直接使用直接使用
str/bytes/bytearray雜湊後取整數改用 SHA-512 再取整數,分佈更均勻