在 Julia 中设置随机种子并且如果从程序的不同部分调用函数则不会生成相同的值

In Julia set random seed and not generating same values if calling a function from different parts of program

我有一个运行一些蒙特卡洛模拟的 Julia 程序。为此,我在调用生成随机值的函数之前设置了一个种子。这个函数可以从我程序的不同部分调用,问题是如果我从我程序的不同部分调用这个函数,我不会生成相同的随机值。

我的问题是:为了获得相同的可重现结果,我是否必须始终从程序的同一部分调用此函数?也许这个问题比语言编程本身更与计算机科学相关。

我想在函数中使用递增的索引进行播种,但我仍然没有得到相同的结果。

如果您将 RNG(随机数生成器)对象作为参数传递给您的函数,则根据您的需要更容易获得随机性。

例如:

using Random

function foo(a=3;rng=MersenneTwister(123))
  return rand(rng,a)
end

现在,您可以调用函数获得相同的结果每次函数调用:

foo() # the same result on any call

然而,这很少是您想要的。更多时候,您希望保证整个实验的可复制性。 在这种情况下,在脚本的开头设置一个 RNG 并使用它调用函数。这将导致函数的输出在每次调用时不同 ,但在整个脚本的一个 运行 和另一个 运行.[=15] 之间相同=]

myGlobalProgramRNG = MersenneTwister() # at the beginning of your script...
foo(rng=myGlobalProgramRNG)

补充两点:注意多线程。如果你想在多线程的情况下保证可复制性,特别是独立于你的脚本 运行 1, 2, 4,... 线程的事实,看看我是如何处理它的 ML library using a generateParallelRngs() 函数。

第二个注意事项是,即使您在脚本的开头创建了自己的 RNG,或者为默认的随机种子播种,不同的 Julia 版本也可能(并且确实如此)更改 RNG 流,因此可复制性是仅在同一 Julia 版本中得到保证。 为了克服这个问题,您可以使用像 StableRNG.jl 这样的包来保证 RNG 流的稳定性(以损失一点性能为代价)...