Python

從 1 個值播種 N 個獨立隨機數生成器的最佳方法

  • September 2, 2016

在我的程序中,我需要運行 N 個單獨的線程,每個線程都有自己的 RNG,用於對大型數據集進行採樣。我需要能夠用一個單一的值來播種整個過程,這樣我才能重現結果。

簡單地依次增加每個索引的種子就足夠了嗎?

目前我使用numpy’s RandomState,它使用 Mersenne Twister 偽隨機數生成器。

下面的代碼片段:

# If a random number generator seed exists
if self.random_generator_seed:
   # Create a new random number generator for this instance based on its
   # own index
   self.random_generator_seed += instance_index
   self.random_number_generator = RandomState(self.random_generator_seed)

本質上,我從用戶輸入的種子(如果存在)開始,對於每個實例/線程,我依次添加正在運行的實例的索引(0 到 N-1)。我不知道這是否是好的做法,或者是否有更好的方法來做到這一點。

當然,這不是很好的做法。例如,考慮使用根種子 12345 和 12346 進行兩次運行時會發生什麼。每次運行都會有N-1共同的流。

Mersenne Twister 實現(包括numpy.randomrandom)通常使用不同的 PRNG 將整數種子擴展為 MT 使用的大狀態向量(624 個 32 位整數);這是來自 的數組RandomState.get_state()。做你想做的事的一個好方法是運行那個 PRNG,用你的輸入整數播種一次,並從中獲取N*62432 位整數。將該流拆分為N狀態向量並用於RandomState.set_state()顯式初始化每個RandomState實例。您可能必須查閱標準庫的 C 源代碼numpy.random_random從標準庫獲取該 PRNG(它們是相同的)。我不確定是否有人為 Python 實現了該 PRNG 的獨立版本。

引用自:https://stats.stackexchange.com/questions/233061

comments powered by Disqus