簡體   English   中英

為什么使用numpy.random.seed不是一個好習慣?

[英]Why using numpy.random.seed is not a good practice?

我想做可重復的測試,使用隨機數作為輸入。 我習慣在Matlab中調用rng,在Python中調用numpy.random.seed。 但是,我注意到種子幫助的Notes部分是:

這是一種方便的遺留功能。

最佳做法是不重新設置BitGenerator,而是重新創建一個新的BitGenerator。 此方法出於遺留原因。 此示例演示了最佳實踐。

 from numpy.random import MT19937 from numpy.random import RandomState, SeedSequence rs = RandomState(MT19937(SeedSequence(123456789))) # Later, you want to restart the stream rs = RandomState(MT19937(SeedSequence(987654321))) 

有沒有人知道使用種子與docstring建議相比有什么注意事項?

來自https://numpy.org/neps/nep-0019-rng-policy.html

獲得可再現的偽隨機數的首選最佳實踐是使用種子實例化生成器對象並將其傳遞。 numpy.random。*便捷函數后面的隱式全局RandomState可能會導致問題,尤其是涉及線程或其他形式的並發時。 全球國家總是有問題的。 我們斷然建議在涉及可重復性時避免使用便利功能。

也就是說,人們確實使用它們並使用numpy.random.seed()來控制它們下面的狀態。 可能難以對API用法進行一致且有用的分類和計數,但一種非常常見的用法是在單元測試中,其中許多全局狀態問題的可能性較小。

該NEP不建議刪除這些功能或更改它們以使用不太穩定的Generator分發實現。 未來的NEP可能會。

具體來說,新PRNG子系統的初始版本應該將這些便利函數作為使用Mersenne Twister BitGenerator對象初始化的全局RandomState上的方法的別名。 對numpy.random.seed()的調用將被轉發到該BitGenerator對象。 另外,全局RandomState實例必須在這個初始版本中可以通過名稱numpy.random.mtrand._rand訪問:Robert Kern很久以前承諾scikit-知道這個名字是穩定的。 哎呦。

為了允許某些變通方法,必須可以將全局RandomState下的BitGenerator替換為任何其他BitGenerator對象(我們將精確的API詳細信息留給新的子系統)。 之后調用numpy.random.seed()應該只將給定的種子傳遞給當前的BitGenerator對象,而不是嘗試將BitGenerator重置為Mersenne Twister。 numpy.random。*便利函數的集合應保持與它們當前相同。 它們應該是RandomState方法的別名,而不是新的不太穩定的分布類(上面的例子中的Generator)。 想要獲得最快,最好的發行版的用戶可以遵循最佳實踐並明確地實例化生成器對象。

該NEP並未建議永久保留這些要求。 在我們擁有新PRNG子系統的經驗之后,我們可以而且應該在未來的NEP中重新審視這些問題。

暫無
暫無

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

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