Сгенерировать одинаковые случайные числа в R и Julia

Я хотел бы генерировать одинаковые случайные числа в R и Julia. Оба языка, по-видимому, используют библиотеку Mersenne-Twister по умолчанию, однако в Julia:

srand(3)
rand()

Производит 0.975, а в R:

set.seed(3)
runif(1)

создает 0.168.

Любые идеи?

Связанные вопросы SO здесь и здесь.

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

Ответ 1

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

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

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

Ответ 2

Выполняя предложение 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

** EDIT **

В соответствии с предложением @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

Ответ 3

См:

?set.seed

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

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

.Random.seed