2014-10-17 25 views
6

在朱莉婭,全球RNG種子可以用檢索朱莉婭RNG種子

srand(SEED) 

設置如何取回種子或全局RNG的當前狀態,例如在稍後的時間呢?

目標是在任何給定的時間點獲得RNG的狀態,並在不同的會話中重新創建它,而無需知道初始種子或同時發生的所有RNG呼叫。

例如,R允許通過

.Random.seed 

我希望的等效方式將在朱存在訪問當前種子。

+0

[閱讀出色的手冊(http://docs.julialang.org/en/release-0.3/stdlib/base/#random-號)。 – jurgemaister 2014-10-17 11:58:12

+1

@jurgemaister這部分涉及設置種子。我找不到任何關於如何恢復的提示。 – Julian 2014-10-17 12:02:07

+0

@jurgemaister:你似乎並不瞭解設置種子和後來發現種子的設置之間的區別。 – DSM 2014-10-17 12:06:10

回答

0

一個明顯的解決方案是在致電srand(seed)之前保存種子值。另外,如果您知道正在使用的RNG,並且它不是加密安全的,那麼您可以從它生成的僞隨機數中計算出值。例如,看到Cracking a linear congruential generator

+0

Julia中的隨機數生成使用Mersenne Twister庫。 – jurgemaister 2014-10-17 12:15:42

+0

然後請參閱[扭轉梅森扭轉者RNG脾氣功能](http://b10l.com/reversing-the-mersenne-twister-rng-temper-function/)等。 – rossum 2014-10-17 12:19:06

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 2016-07-24 21:29:11

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庫(見Baserandom.jldSFMT.jl

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 

爲了保存恢復完整的狀態,你可以做簡單的事情,只存儲整個Base.Random.GLOBAL_RNG對象。一個簡單的方法將使用JLD包。

在我的私人包中,我手動保存/讀取rng狀態到HDF5,請參閱here

編輯:這當然@ IainDunning的回答更明確的版本