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