Генерировать одинаковые случайные числа в R и 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.

какие идеи?

связанные так вопросы здесь и здесь.

мой случай использования для тех, кто заинтересован: тестирование нового кода Julia, который требуется генерация случайных чисел( например, статистическая загрузка) путем сравнения выходных данных с данными эквивалентных библиотек в R.

3 ответов


Это старая проблема.

Пол Гилберт обратился к тому же вопросу в конце 1990-х годов (!!) при попытке утверждать, что моделирование в R (тогда новичок) дало тот же результат, что и в S-Plus (тогда действующий).

его решение, и еще золотой подход AFAICT: повторно реализовать в свежем коде на обоих языках как это единственный способ обеспечить одинаковый посев, состояние,... и все, что на него влияет.


достижения RCall предложение, сделанное @Khashaa, ясно, что вы можете установить семя и получить случайные числа из 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, вот более простой / чистый способ доступа R случайные числа из Julia.

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

посмотреть:

?set.seed

"Мерсенн-Твистер": От Мацумото и Нисимуры (1998). Скрученный GFSR с периодом 2^19937-1 и равнораспределением в 623 последовательных измерениях (за весь период). "Семя" -это 624-мерный набор 32-разрядных целых чисел плюс текущая позиция в этом наборе.

и вы можете увидеть, можете ли вы связать один и тот же код C с обоих языков. Если вы хотите увидеть список/вектор, типа:

.Random.seed