我有一個包含很多 random.choice、random.choices、random.randint、random.uniform 等函式的函式,我必須將 random.seed 放在所有這些函式之前。我使用python 3.8.6,無論如何要保持在函式中初始化的種子,或者至少有一種方法來切換它而不是每次都這樣做?
uj5u.com熱心網友回復:
聽起來您對PRNG 的作業方式有誤解。它們是生成器(它的名字就在那里!),它產生一系列確定性的值,但其構造是為了與基于統計測驗的真正隨機性無法區分。本質上,他們試圖通過圖靈測驗/模仿游戲為了隨機性。他們通過維護位的內部狀態來做到這一點,每次呼叫生成器時,該狀態都會通過確定性演算法進行更新。種子應該扮演的唯一角色是設定初始內部狀態,以便單獨運行創建可重現的序列。為單獨的運行重復種子對于除錯和玩技巧以減少蒙特卡羅模擬中某些類別的估計量的可變性非常有用。
所有 PRNG 最終都會回圈。由于內部狀態由有限數量的位組成,并且狀態更新機制是確定性的,因此整個序列將從發生任何狀態重復的點開始重復。換句話說,輸出序列實際上是一個值回圈。種子值與偽亂數的質量無關,這是由狀態轉換演算法決定的。從概念上講,您可以將種子視為 PRNG 回圈的入口點。(請注意,這并不意味著您有一個回圈,因為您觀察到相同的輸出,回圈僅在產生輸出的內部狀態重復時才會發生。這就是為什么 1980 年代和 90 年代看到了狀態空間包含更多位的 PRNG 出現的原因比輸出空間,生日問題,而無需從那時起逐字重復序列。)
如果您通過多次重新播種而弄亂了一個好的 PRNG,那么您將取消設計通過基于統計的圖靈測驗的演算法的所有艱苦作業。由于種子并不能決定結果的質量,因此您會呼叫額外的成本(從種子中產生新狀態),沒有獲得任何統計上的好處,并且很可能會損害通過統計測驗的能力。不要那樣做!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/367720.html
