Python
從 1 個值播種 N 個獨立隨機數生成器的最佳方法
在我的程序中,我需要運行 N 個單獨的線程,每個線程都有自己的 RNG,用於對大型數據集進行採樣。我需要能夠用一個單一的值來播種整個過程,這樣我才能重現結果。
簡單地依次增加每個索引的種子就足夠了嗎?
目前我使用
numpy
’sRandomState
,它使用 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.random
和random
)通常使用不同的 PRNG 將整數種子擴展為 MT 使用的大狀態向量(624 個 32 位整數);這是來自 的數組RandomState.get_state()
。做你想做的事的一個好方法是運行那個 PRNG,用你的輸入整數播種一次,並從中獲取N*624
32 位整數。將該流拆分為N
狀態向量並用於RandomState.set_state()
顯式初始化每個RandomState
實例。您可能必須查閱標準庫的 C 源代碼numpy.random
或_random
從標準庫獲取該 PRNG(它們是相同的)。我不確定是否有人為 Python 實現了該 PRNG 的獨立版本。