16

我想在 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 问题在这里这里

我对那些感兴趣的人的用例:通过将输出与 R 中等效库的输出进行比较,测试需要随机数生成(例如统计引导)的新 Julia 代码。

4

3 回答 3

7

这是一个老问题。

Paul Gilbert 在 1990 年代后期(!!)试图断言 R(当时的新人)中的模拟与 S-Plus(当时的现任)中的模拟给出了相同的结果时解决了同样的问题。

他的解决方案,仍然是 AFAICT 的黄金方法:用两种语言重新实现新代码,这是确保相同的种子、状态……以及其他任何影响它的唯一方法。

于 2015-04-07T03:39:00.873 回答
5

遵循@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 的建议,这是RJulia.

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
于 2015-04-12T14:23:35.250 回答
2

看:

?set.seed

“Mersenne-Twister”:来自松本和西村(1998 年)。一个扭曲的 GFSR,周期为 2^19937 - 1,在 623 个连续维度(在整个周期内)均等分布。“种子”是一个 624 维的 32 位整数集合加上该集合中的当前位置。

您可能会看到是否可以链接到两种语言的相同 C 代码。如果要查看列表/向量,请键入:

.Random.seed
于 2015-04-07T06:17:01.933 回答