我需要以可复制的方式生成数百万个随机数组。阵列将在与OpenMPI连接的机器集群上生成。每个“任务”都需要一个包含数千个随机整数的独立数组。
我希望能够执行多次运行,以便可以复制任何给定的运行。该代码目前在R中,但我对多台机器上并行PRNG生成的一般原则比对OpenMPI或R细节更感兴趣。
理论上我可以在'master'上生成所有随机系列,然后将整个系列与任务一起发送给'slave',但这感觉很笨重。相反,我想在收到任务后在slave上生成随机序列。
目前,我在命令行上提供了一个随机数种子,主人用它来为从属生成一系列种子。为每个任务分配从该流顺序获取的种子。此种子将与任务详细信息一起发送给从属服务器。
主人:
srand(commandLineArg)
runParameters = stuff
for (1 .. numTasks) {
slaveSeed = rand()
scheduleTask(slaveSeed, runParameters)
}
从(一个或多个):
srand(slaveSeed)
for n (1 .. numPoints) {
data[n] = rand()
}
return doStuff(data)
这是一种安全的方法吗?是百万系列产生的 从一百万种子流中读取一千个随机数 独立和随机顺序读取百万系列的一个 一个种子流中的一千个数字?
是否需要让master生成一系列随机slave 种子,或者使用简单的同样有效 奴隶系列(1..numTasks)?我宁可不加假 如果这一步只是一个游戏,那么安全感。
是否有可重复生成的最佳实践 以这种方式伪随机样本?我见过参考SPRNG 和L'Ecuyer接近。这些方法是否有益处 我已经描述过?
谢谢!