【发布时间】:2015-11-21 19:24:50
【问题描述】:
我正在做 MC 模拟,我需要在 1 和变量上限 n_mol 之间的范围内生成随机整数
执行此操作的特定 Julia 函数是 rand(1:n_mol),其中 n_mol 是一个整数,随着每次 MC 迭代而变化。问题是这样做很慢......(可能是 Julia 开发人员需要解决的问题)。所以,我没有使用那个特定的函数调用,而是考虑在 [0,1) 中生成一个随机浮点数乘以n_mol,然后得到结果的整数部分:int(rand()*n_mol) 现在的问题是int()四舍五入,所以我可以得到0和n_mol之间的数字,我不能得到0...所以我目前使用的解决方案是使用ifloor并添加@987654333 @,ifloor(rand()*n_mol)+1,比第一个快很多,但比第二个慢。
function t1(N,n_mol)
for i = 1:N
rand(1:n_mol)
end
end
function t2(N,n_mol)
for i = 1:N
int(rand()*n_mol)
end
end
function t3(N,n_mol)
for i = 1:N
ifloor(rand()*n_mol)+1
end
end
@time t1(1e8,123456789)
@time t2(1e8,123456789)
@time t3(1e8,123456789)
elapsed time: 3.256220849 seconds (176 bytes allocated)
elapsed time: 0.482307467 seconds (176 bytes allocated)
elapsed time: 0.975422095 seconds (176 bytes allocated)
那么,有什么方法可以在第二次测试附近的速度下更快地做到这一点? 这很重要,因为 MC 模拟进行了超过 1e10 次迭代。 结果必须是整数,因为它将用作数组的索引。
【问题讨论】:
-
你看过 Julia 的 MCMC 库 Lora.jl 吗?
-
在实现自己的快捷方式时要非常小心。我不是随机数专家,但我知道您可以通过修改随机数轻松引入偏差。
t2和t3都需要n_mol ≪ maxintfloat(Float64)。t2在 Julia 0.4 上会略微偏向偶数,因为它默认使用 "unbiased" rounding(讽刺的是,不是吗?同样,随着n_mol的增加,这种影响会更大)。 -
感谢您的建议!