[英]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
模塊中的所有頂級函數都會提供給單個對象。 這意味着在創建f3
, f2
和f1
設置的種子已被取代,種子不獨立於全局隨機對象。 為每個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.