首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R和Julia中生成相同的随机数

在R和Julia中生成相同的随机数
EN

Stack Overflow用户
提问于 2015-04-07 01:48:45
回答 3查看 1.3K关注 0票数 17

我想在R和Julia中生成相同的随机数。这两种语言在默认情况下似乎都使用Mersenne-Twister库,但是在Julia 1.0.0中:

代码语言:javascript
复制
julia> using Random
julia> Random.seed!(3)
julia> rand()
0.8116984049958615

生成0.811...,而在R中:

代码语言:javascript
复制
set.seed(3)
runif(1)

产生0.168

有什么想法吗?

因此,herehere是相关的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-07 03:39:00

这是个老问题。

Paul Gilbert在20世纪90年代末处理了同样的问题(!!)当试图断言R中的模拟(当时是新来的)时,结果与S(当时的现任者)的结果相同。

他的解决方案,仍然是黄金方法AFAICT:重新实现在新的代码在两种语言,这是唯一的办法,以确保相同的种子,状态,.还有其他影响它的东西。

票数 8
EN

Stack Overflow用户

发布于 2015-04-12 14:23:35

按照@Khashaa提出的RCall建议,很明显,您可以设置种子并从R获得随机数。

代码语言:javascript
复制
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

代码语言:javascript
复制
> 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访问Julia随机数的更简单/更简洁的方法。

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2015-04-07 06:17:01

请参见:

代码语言:javascript
复制
?set.seed

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

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

代码语言:javascript
复制
.Random.seed
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29482411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档