我有一个函数模块,需要确保所有函数都使用相同的随机值。我目前有两种解决方案,在每次调用时重置种子:
using Distributions
function random_values(n)
Random.seed!(1)
rand(Normal(), n)
end或者类似地,直接实例化它:
using Distributions
function random_values(n)
rand(MersenneTwister(1), Normal(), n)
end这是可行的,但我有几个函数,代码变得有点冗长。我宁愿在模块级别设置一个种子,以便所有函数都使用相同的。我如何才能最好地做到这一点?
发布于 2022-06-29 21:24:42
我相信你想要的是有两个或两个以上的函数(f1,f2,.)每个调用rand()。您希望它们处于“同步”状态,这样,通过一系列函数调用,每个函数的每个顺序调用都会获得相同的值序列(因此,第三次对f2的调用使用与第三次对f1的调用相同的rand()值)。
为此,最好在将每个函数初始化为相同的种子之后,显式地将一个复制的RNG对象传递给每个函数:
init = 1234
rngvector(n) = [MersenneTwister(init) for _ in 1:n]
RNG = rngvector(3)
function f1(rng, ...)
x = rand(rng, ...)
...
end
function f2(rng, ...)
x = rand(rng, ...)
...
end
f1(RNG[1], ...)然后将与
f2(RNG[2], ...).这确实意味着更多的编码,因为您在每个函数中增加了一个参数,但是初始额外的编码给您带来的灵活性和可重复性使您在编写剩下的代码时使用Monte方法可能非常值得。
https://stackoverflow.com/questions/72793998
复制相似问题