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

时间:2017-10-18 11:02:15

标签: julia

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

我正在构建比较治疗的患者离散事件模拟模型。为了减少处理之间的蒙特卡罗采样误差/变化,我希望能够在一次治疗下沿着患者路径的各个点保存随机数发生器的当前状态。然后我可以在适当的时间恢复它们以进行下一次治疗。简单地在开始时设置种子并在不同治疗下为同一患者重置它不符合我的需要 - 随机性质将确保相同的患者可以按照不同的顺序次序,不同的情景跟踪事件,然后可能在以后重置时再次收敛需要。

我插入了Julia编程代码,清楚地显示了我的问题 - 在第一个例子中,保存随机生成器状态,从设置种子清楚地工作这么多次迭代:输出“true”为path1 == path3。此示例使用Normal分布。感谢BogumiłKamiński的功能代码(从他的stackoverflow回答Is there a way to obtain the state of the random number generator?中借用/偷走了它)。

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

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

非常感谢(并为长篇大论道歉:认为需要理由为什么不重复问题)

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"

以下版本无法正常使用gamma(或beta)

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" 

0 个答案:

没有答案