Julia-存储随机数生成器当前状态(Beta/Gamma)-非“;“基础”;发电机

Julia-存储随机数生成器当前状态(Beta/Gamma)-非“;“基础”;发电机,julia,Julia,关于stackoverflow如何在Julia中保存“Base”随机数生成器的当前状态,已经出现了一个答案(问题本身标记为重复)。但是,所有问题或答案都与“基本”生成器之外设置的分布的随机样本无关(即使它们用于Julia的主“分布”包)。两个这样的单变量分布是Gamma和Beta,它们的随机偏差似乎是由从包statsfons调用生成器的分布包创建的(它本身似乎依赖于R头/库) 我正在建立一个比较治疗的患者离散事件模拟模型。为了减少monte carlo采样误差/治疗之间的差异,我希望能够在一次治

关于stackoverflow如何在Julia中保存“Base”随机数生成器的当前状态,已经出现了一个答案(问题本身标记为重复)。但是,所有问题或答案都与“基本”生成器之外设置的分布的随机样本无关(即使它们用于Julia的主“分布”包)。两个这样的单变量分布是Gamma和Beta,它们的随机偏差似乎是由从包statsfons调用生成器的分布包创建的(它本身似乎依赖于R头/库)

我正在建立一个比较治疗的患者离散事件模拟模型。为了减少monte carlo采样误差/治疗之间的差异,我希望能够在一次治疗下保存患者路径上不同点的随机数生成器的当前状态。然后,我可以在适当的时间点恢复它们,以便进行下一次治疗。简单地在开始时设置种子并在不同治疗下为同一患者重置种子无法满足我的需要-随机性将确保同一患者可能以不同的顺序、不同的场景跟踪事件,然后可能在需要重置的地方再次收敛

我插入了Julia编程代码,它清楚地显示了我的问题——在第一个示例中,通过设置种子来保存如此多次的随机生成器状态显然有效:对于path1==path3,输出“true”。本例使用正态分布。多亏了BogumiłKamiński提供的函数代码(从他的答案中借用/偷走了它)

但对于使用Gamma分布的代码示例,相同的函数不起作用(对于最终命令path1==path3,代码打印“false”)

任何人都可以提供与下面列出的功能精神类似的等效功能,但可以用于Gamma和Beta随机抽取(或任何不是“简单重置手动种子值”的替代建议)

非常感谢(并为长帖子道歉:思考需要的理由为什么不重复问题)

对于gamma(或beta),下面的选项无法正常工作


最后一个
println(path1==path3)#在我的设置(v0.7)上打印“false”
在我的设置(0.6)上打印
true
。事实上,
Rmath.jl
Rmath julia
(它的C实现)到julia的
rand
,后者确实使用了
GLOBAL\u RNG
。谢谢Dan-很高兴知道这一点。我使用的是官方的“稳定”版本0.6。我无法使0.7在Windows计算机上正确使用发行版。看起来如果我等待1.0版,我的问题就会得到解决(虽然这意味着等待的时间不确定-因此不理想)。刚刚看到你后面的帖子。我用mkl下载了juliaprowindows选项,并在Juno/Atom中运行它。你是在Linux上使用0.6吗?在Ubuntu上使用0.6还是在Fedora上使用0.6?我也一样。您是否确实在新会话中运行了上述操作?最后一个
println(path1==path3)#在我的设置(v0.7)上打印“false”
prints
true
,对我来说也是
true
(0.6)。事实上,
Rmath.jl
Rmath julia
(它的C实现)到julia的
rand
,后者确实使用了
GLOBAL\u RNG
。谢谢Dan-很高兴知道这一点。我使用的是官方的“稳定”版本0.6。我无法使0.7在Windows计算机上正确使用发行版。看起来如果我等待1.0版,我的问题就会得到解决(虽然这意味着等待的时间不确定-因此不理想)。刚刚看到你后面的帖子。我用mkl下载了juliaprowindows选项,并在Juno/Atom中运行它。你是在Linux上使用0.6吗?在Ubuntu上使用0.6还是在Fedora上使用0.6?我也一样。您是否确实在新会话中运行了上述操作?
using Distributions

function reset_global_rng(rng_state)
 Base.Random.GLOBAL_RNG.seed = rng_state.seed
 Base.Random.GLOBAL_RNG.state = rng_state.state
 Base.Random.GLOBAL_RNG.vals = rng_state.vals
 Base.Random.GLOBAL_RNG.idx = rng_state.idx
end

srand(1234) # set seed
# Now generate 100,000 Normal rands
r = rand(Normal(3,11),10000) 
#Now from herein my model can take two different paths:store generator
rs = deepcopy(Base.Random.GLOBAL_RNG)
# Now take  path 1
path1 = rand(Normal(5,10),2)
# path2 has higher mean but more uncertainty but want to minimise
#monte carlo sampling error, hence desire to reset generator
reset_global_rng(rs)
path2 = rand(Normal(6,12),2)
#To prove the resetting worked do path3 below with same parameters as path1
reset_global_rng(rs)
path3 = rand(Normal(5,10),2)
println(path1==path3) # prints "true"
srand(1234) # set seed
# Now generate 100,000 Normal rands
r = rand(Normal(3,11),10000) 
#Now from herein my model can take two different paths
# store generator value
rs = deepcopy(Base.Random.GLOBAL_RNG)
# Now take  path 1
path1 = rand(Gamma(5,10),2)
# path2 has higher mean but more uncertainty but want to minimise
#monte carlo sampling error, hence desire to reset generator
reset_global_rng(rs)
path2 = rand(Gamma(6,12),2)
#To prove the resetting hasn't worked:
reset_global_rng(rs)
path3 = rand(Gamma(5,10),2)
println(path1==path3) # prints "false"