在 R 和 Julia 中生成相同的随机数
Generate identical random numbers in R and Julia
我想在 R 和 Julia 中生成相同的随机数。两种语言似乎都默认使用 Mersenne-Twister 库,但是在 Julia 1.0.0 中:
julia> using Random
julia> Random.seed!(3)
julia> rand()
0.8116984049958615
产生 0.811...
,而在 R 中:
set.seed(3)
runif(1)
产生 0.168
.
有什么想法吗?
相关的 SO 问题 here and here。
我的用例供感兴趣的人使用:通过将输出与 R 中等效库的输出进行比较,测试需要随机数生成(例如统计引导)的新 Julia 代码。
这是个老问题了。
Paul Gilbert 在 1990 年代后期 (!!) 解决了同样的问题,当时他试图断言 R(当时是新人)中的模拟给出了与 S-Plus(当时是现任)中的模拟相同的结果。
他的解决方案,仍然是 AFAICT 的黄金方法:用两种语言重新实现新代码,因为这是确保相同的播种、状态……以及任何其他影响它的唯一方法。
参见:
?set.seed
"Mersenne-Twister":
来自 Matsumoto 和 Nishimura (1998)。周期为 2^19937 - 1 且在 623 个连续维度(在整个周期内)均等分布的扭曲 GFSR。 “种子”是一组 624 维的 32 位整数加上该集合中的当前位置。
您可能会看到是否可以从两种语言 link 到相同的 C 代码。如果要查看 list/vector,请键入:
.Random.seed
按照@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
随机数的 simpler/cleaner 方法
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
我想在 R 和 Julia 中生成相同的随机数。两种语言似乎都默认使用 Mersenne-Twister 库,但是在 Julia 1.0.0 中:
julia> using Random
julia> Random.seed!(3)
julia> rand()
0.8116984049958615
产生 0.811...
,而在 R 中:
set.seed(3)
runif(1)
产生 0.168
.
有什么想法吗?
相关的 SO 问题 here and here。
我的用例供感兴趣的人使用:通过将输出与 R 中等效库的输出进行比较,测试需要随机数生成(例如统计引导)的新 Julia 代码。
这是个老问题了。
Paul Gilbert 在 1990 年代后期 (!!) 解决了同样的问题,当时他试图断言 R(当时是新人)中的模拟给出了与 S-Plus(当时是现任)中的模拟相同的结果。
他的解决方案,仍然是 AFAICT 的黄金方法:用两种语言重新实现新代码,因为这是确保相同的播种、状态……以及任何其他影响它的唯一方法。
参见:
?set.seed
"Mersenne-Twister": 来自 Matsumoto 和 Nishimura (1998)。周期为 2^19937 - 1 且在 623 个连续维度(在整个周期内)均等分布的扭曲 GFSR。 “种子”是一组 624 维的 32 位整数加上该集合中的当前位置。
您可能会看到是否可以从两种语言 link 到相同的 C 代码。如果要查看 list/vector,请键入:
.Random.seed
按照@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
随机数的 simpler/cleaner 方法
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