我并行运行相同代码的n个实例,希望每个实例使用独立的随机数。
为此,在开始并行计算之前,我创建一个随机状态列表,如下所示:
import numpy.random as rand
rand_states = [(rand.seed(rand.randint(2**32-1)),rand.get_state())[1] for j in range(n)]
然后,我将rand_states
的一个元素传递给每个并行进程,我基本上是这样做的
rand.set_state(rand_state)
data = rand.rand(10,10)
为了让事情重现,我跑了np.random.种子(0)在每件事的开始。你知道吗
这像我希望的那样工作吗?这是实现它的正确方法吗?
(我不能预先存储数据数组本身,因为(I)有很多地方在并行进程中生成随机数,(ii)这会在并行代码和管理非并行代码之间引入不必要的逻辑耦合,(iii)实际上我在N<M
处理器上运行M
片所有M个切片的数据都太大,无法存储)
numpy.random.get_state
设置NumPy生成器的全局实例的状态。但是,每个并行进程应该使用自己的PRNG实例。numpy1.17及更高版本为此提供了numpy.random.Generator
类。(事实上,numpy.random.get_state
和其他numpy.random.*
函数现在是自numpy1.17以来的遗留函数。NumPy的新RNG系统是proposal to change the RNG policy的结果。)一个很好的方法是使用所谓的“基于计数器的”PRNG(Salmon et al.,“并行随机数:简单到1,2,3”,2011),给每个种子一个不重叠的随机数流。例如,numpy1.17中新添加的位生成器
numpy.random.SFC64
。你知道吗有几种其他的策略用于播种多个进程,但几乎所有这些策略都涉及让每个进程使用自己的PRNG实例,而不是共享一个全局PRNG实例(就像遗留的
numpy.random.*
函数一样)。这些策略在我的“Seeding Multiple Processes”一节和NumPy文档中的“Parallel Random Number Generation”页中进行了解释。你知道吗相关问题 更多 >
编程相关推荐