使用 GNU 并行进程的独立 numpy 随机数
Independent numpy random numbers using GNU parallel processes
据我了解,建议在 运行 与彼此独立的随机数生成器并行处理时使用 numpy.random.SeedSequence() 。使用 python 多处理库时,这似乎很容易。但是,我无法想出一种方法来通过 GNU parallel 使用此功能。有没有一种巧妙的方法来确保使用 GNU 并行生成独立的随机数 运行 python 脚本?
您在评论中关于使用进程 ID 的想法确实是一个有效的想法。问题是您希望种子中有足够的熵——伪-随机数生成器的输出仅由其种子定义。使用开始时间作为种子会随时间产生不同的输出,但并行作业的输出通常相同。
仅使用 进程 ID 也不是一个好主意,因为它通常是一个相当小的数字。那里通常只有 16 或 32 位数据。将它与时间相结合会增加熵。
现在您提到进程 ID 可能是“线性相关的”- 在 Linux 上很常见,进程 ID 递增。这本身并不是真正的问题。任何像样的 PRNG 都应该足够强大来处理这样的种子。
一个值得注意的例外是密码学。在那种情况下,各种 PRNG 的独立性可能是一个更大的问题,但我们需要更多的细节来确定。这就是为什么普遍的建议是使用现有的加密库。
据我了解,建议在 运行 与彼此独立的随机数生成器并行处理时使用 numpy.random.SeedSequence() 。使用 python 多处理库时,这似乎很容易。但是,我无法想出一种方法来通过 GNU parallel 使用此功能。有没有一种巧妙的方法来确保使用 GNU 并行生成独立的随机数 运行 python 脚本?
您在评论中关于使用进程 ID 的想法确实是一个有效的想法。问题是您希望种子中有足够的熵——伪-随机数生成器的输出仅由其种子定义。使用开始时间作为种子会随时间产生不同的输出,但并行作业的输出通常相同。
仅使用 进程 ID 也不是一个好主意,因为它通常是一个相当小的数字。那里通常只有 16 或 32 位数据。将它与时间相结合会增加熵。
现在您提到进程 ID 可能是“线性相关的”- 在 Linux 上很常见,进程 ID 递增。这本身并不是真正的问题。任何像样的 PRNG 都应该足够强大来处理这样的种子。
一个值得注意的例外是密码学。在那种情况下,各种 PRNG 的独立性可能是一个更大的问题,但我们需要更多的细节来确定。这就是为什么普遍的建议是使用现有的加密库。