这是一个老问题。
在上世纪90年代末,Paul Gilbert曾尝试证明在R(当时的新手)中进行的模拟能够得到与S-Plus(当时的老牌软件)相同的结果,解决了同样的问题。
他提出的方案至今仍然是最佳实践:在两种语言中都重新编写代码以确保种子、状态等完全相同。
跟随@Khashaa的RCall
建议,我们可以清晰地设置种子并从R
获取随机数。
julia> using RCall
julia> RCall.reval("set.seed(3)")
RCall.NilSxp(16777344,Ptr{Void} @0x0a4b6330)
julia> a = zeros(Float64,20);
julia> unsafe_copy!(pointer(a), RCall.reval("runif(20)").pv, 20)
Ptr{Float64} @0x972f4860
julia> map(x -> @printf("%20.15f\n", x), a);
0.168041526339948
0.807516399072483
0.384942351374775
0.327734317164868
0.602100674761459
0.604394054040313
0.124633444240317
0.294600924244151
0.577609919011593
0.630979274399579
0.512015897547826
0.505023914156482
0.534035353455693
0.557249435689300
0.867919487645850
0.829708693316206
0.111449153395370
0.703688358888030
0.897488264366984
0.279732553754002
并且来自R
:
> options(digits=15)
> set.seed(3)
> runif(20)
[1] 0.168041526339948 0.807516399072483 0.384942351374775 0.327734317164868
[5] 0.602100674761459 0.604394054040313 0.124633444240317 0.294600924244151
[9] 0.577609919011593 0.630979274399579 0.512015897547826 0.505023914156482
[13] 0.534035353455693 0.557249435689300 0.867919487645850 0.829708693316206
[17] 0.111449153395370 0.703688358888030 0.897488264366984 0.279732553754002
** 编辑 **
根据@ColinTBowers的建议,这是一种更简单/更清晰的方法,可在Julia
中访问R
个随机数。
julia> using RCall
julia> reval("set.seed(3)");
julia> a = rcopy("runif(20)");
julia> map(x -> @printf("%20.15f\n", x), a);
0.168041526339948
0.807516399072483
0.384942351374775
0.327734317164868
0.602100674761459
0.604394054040313
0.124633444240317
0.294600924244151
0.577609919011593
0.630979274399579
0.512015897547826
0.505023914156482
0.534035353455693
0.557249435689300
0.867919487645850
0.829708693316206
0.111449153395370
0.703688358888030
0.897488264366984
0.279732553754002
RCall
可能可以快捷地实现包装。但这也强调了一个主要的观点:如果你想要相同的 RNG 流,你 确实 需要运行相同的代码。我可能会从一个简单的生成器(比如 Marsaglia 的 KISS)开始,在两侧编写相应的代码。 - Dirk EddelbuettelBase.Random.globalRNG() |> typeof
返回 Base.Random.MersenneTwister
。R的Mersenne Twister仅略微修改了原始论文。我认为R的种子也有点问题。 - rickhg12hsreval("set.seed(3)")
然后跟着x = rcopy("runif(20)")
将数字导入到Julia的本地变量x
中吗?也许我漏掉了什么? - Colin T BowersRCall
新手,只是报告了我尝试过的第一件事情,并且它起作用了。如果有更简单和/或更可靠的方法将R
随机数传递到Julia
中,那我完全赞成! - rickhg12hs请参见:
?set.seed
.Random.seed
srand(3); rand()
生成了0.8116984049958615
。 - rickhg12hs