2014-10-17 4 views
6

В Джулии, семя для глобальной RNG может быть установлено сПолучения RNG семян в Джулии

srand(SEED) 

Как можно получить семена или текущее состояние глобальной RNG, например снова в более позднем пункте?

Цель состоит в том, чтобы получить состояние RNG в любой момент времени и воссоздать его на другом сеансе, не зная начального семени или всех вызовов RNG, которые произошли в то же время.

Например, R позволяет получить доступ к текущему семени через

.Random.seed 

Я надеялся, что эквивалентный способ будет существовать в Джулию.

+0

[Read The Fabulous Руководство] (http://docs.julialang.org/en/release-0.3/stdlib/base/#random- номера). – jurgemaister

+1

@jurgemaister Эта часть относится к установке семени.Я не мог найти упоминания о том, как вернуть его. – Julian

+0

@jurgemaister: вы, кажется, не понимаете разницу между установкой семени и потом выяснением того, на что было установлено семя. – DSM

ответ

0

Очевидным решением является сохранение начального значения до того, как вы позвоните по телефону srand(seed).

В качестве альтернативы, если вы знаете используемый RNG и не криптографически безопасны, вы можете рассчитать значения из псевдослучайных чисел, которые он производит. Например, см Cracking a linear congruential generator

+0

Генерация случайных чисел в Джулии использует библиотеку Мерсерн Твистер. – jurgemaister

+0

Затем см. [Реверсивная функция темпера MERENNE Twister RNG] (http://b10l.com/reversing-the-mersenne-twister-rng-temper-function/) и тому подобное. – rossum

4

Base.Random.RANDOM_SEED является вашим другом для получения семян:

julia> srand(10) 

julia> Base.Random.RANDOM_SEED 
1-element Array{Uint32,1}: 
0x0000000a 

julia> srand(1) 

julia> Base.Random.RANDOM_SEED 
1-element Array{Uint32,1}: 
0x00000001 

julia> srand(0xF) 

julia> Base.Random.RANDOM_SEED 
1-element Array{Uint32,1}: 
0x0000000f 

Это не документировано, но the source достаточно легко читать. Я не уверен, как получить текущее состояние RNG, но оно может быть в модуле dSFMT.

+4

Теперь это доступно через 'Base.Random.GLOBAL_RNG.seed', а не' Base.Random.RANDOM_SEED'. – Chris

2

Использование специализированного MersenneTwister с явной переменной (вместо скрытой глобальной, предоставляемой функциями случайных значений по умолчанию) может быть обеспечена функциональность вам потребуется:

newmt = Base.Random.MersenneTwister(123) 
randvec = [rand(newmt) for i=1:100] 
# save state now 
savestate = deepcopy(newmt.state) 
randvec2 = [rand(newmt) for i=1:20] 
# rewind state to old state 
newmt.state = savestate 
randvec3 = [rand(newmt) for i=1:20] 
if randvec2==randvec3 
    println("works!") 
end 

deepcopy бросил меня на секунду. Кроме того, было бы легче получить доступ к глобальному случайному состоянию генератора, но это может потребовать ccall ИНГОВ библиотеки libdSFMT (см random.jl и dSFMT.jl в Base.

0

Для лучшего контроля при использовании генератора случайных функций и, в общем,

RND = srand(0) 
function coolfun() 
    println(RND.idx) 
    output = srand(RND, 100) 
    ... 
end 
1

Вы должны получить семена, как этот

reinterpret(Int32, Base.Random.GLOBAL_RNG.seed) 

Тест:

julia> srand(123456789); 

julia> reinterpret(Int32, Base.Random.GLOBAL_RNG.seed) 
1-element Array{Int32,1}: 
123456789 

Для сохранения восстановления полного состояния rng вы можете сделать простую вещь и просто сохранить весь объект Base.Random.GLOBAL_RNG. Простым способом будет использование пакета JLD.

В моем личном пакете я вручную сохраняю/читаю состояние rng на HDF5, см. here.

EDIT: Это, конечно, более явный вариант @ IainDunning Ответим

Смежные вопросы