簡體   English   中英

隨機種子如何在Python的函數工廠中工作?

[英]How does a random seed work in a function factory in Python?

假設我想在給定成功概率的情況下生成一堆二進制數生成器。 我所關心的一個問題是關於隨機種子。 f1,f2,f3的隨機種子是它們的創建時間,對吧? 並且無論全局命名空間中的隨機種子如何,每個函數的種子都是固定的,對吧?

def f(p):
    import random, time
    random.seed(time.time())
    def g():
        return 1 if random.random() < p else 0
    return g

f1 = f(0.05)
f2 = f(0.65)
f3 = f(0.25)

每次調用f()時都會將種子傳遞給全局隨機對象 ,因為random模塊中的所有頂級函數都會提供給單個對象。 這意味着在創建f3f2f1設置的種子已被取代,種子獨立於全局隨機對象。 為每個f()調用再次導入random並不會給你一個新的狀態,因為每次加載模塊對象本身時(實際上只在第一次導入時)才會重新綁定名稱。

如果你想為每個函數設置一個種子隨機生成器,你需要創建單獨的random.Random()實例:

import random
import time

def f(p):
    seeded_random = random.Random(time.time())
    def g():
        return 1 if seeded_random.random() < p else 0
    return g

random模塊文檔

該模塊提供的函數實際上是random.Random類的隱藏實例的綁定方法。 您可以實例化您自己的Random實例,以獲取不共享狀態的生成器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM