From a66bcfcb45000d3d033abcbeff5958fa7e820935 Mon Sep 17 00:00:00 2001 From: Rafael Fourquet Date: Sun, 23 Nov 2014 18:54:31 +0530 Subject: [PATCH] fix #9124 (srand initialize libRmath RNG) --- base/dSFMT.jl | 9 ++++++++- base/random.jl | 35 +++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/base/dSFMT.jl b/base/dSFMT.jl index 154fe37ab7402..4d546a00baf96 100644 --- a/base/dSFMT.jl +++ b/base/dSFMT.jl @@ -1,7 +1,7 @@ module dSFMT export DSFMT_state, dsfmt_get_min_array_size, dsfmt_get_idstring, - dsfmt_init_gen_rand, dsfmt_init_by_array, + dsfmt_init_gen_rand, dsfmt_init_by_array, dsfmt_gv_init_by_array, dsfmt_fill_array_close_open!, dsfmt_fill_array_close1_open2!, win32_SystemFunction036! @@ -39,6 +39,13 @@ function dsfmt_init_by_array(s::DSFMT_state, seed::Vector{UInt32}) s.val, seed, length(seed)) end +function dsfmt_gv_init_by_array(seed::Vector{UInt32}) + ccall((:dsfmt_gv_init_by_array,:libdSFMT), + Void, + (Ptr{UInt32}, Int32), + seed, length(seed)) +end + function dsfmt_fill_array_close1_open2!(s::DSFMT_state, A::Ptr{Float64}, n::Int) @assert Int(A) % 16 == 0 # the underlying C array must be 16-byte aligned @assert dsfmt_min_array_size <= n && iseven(n) diff --git a/base/random.jl b/base/random.jl index af916e706005e..7942c053cc96f 100644 --- a/base/random.jl +++ b/base/random.jl @@ -65,18 +65,11 @@ function srand(r::MersenneTwister, seed::Vector{UInt32}) return r end -## initialization -function __init__() - srand() +## initialization - # Temporary fix for #8874 - ccall((:dsfmt_gv_init_by_array,:libdSFMT), - Void, - (Ptr{UInt32}, Int32), - 1+GLOBAL_RNG.seed, length(GLOBAL_RNG.seed)) +__init__() = srand() -end ## make_seed() # make_seed methods produce values of type Array{UInt32}, suitable for MersenneTwister seeding @@ -130,9 +123,27 @@ srand(r::MersenneTwister) = srand(r, make_seed()) srand(r::MersenneTwister, n::Integer) = srand(r, make_seed(n)) srand(r::MersenneTwister, filename::AbstractString, n::Integer=4) = srand(r, make_seed(filename, n)) -srand() = srand(GLOBAL_RNG) -srand(seed::Union(Integer, Vector{UInt32})) = srand(GLOBAL_RNG, seed) -srand(filename::AbstractString, n::Integer=4) = srand(GLOBAL_RNG, filename, n) + +function dsfmt_gv_srand() + # Temporary fix for #8874 and #9124: update global RNG for Rmath + dsfmt_gv_init_by_array(GLOBAL_RNG.seed+1) + return GLOBAL_RNG +end + +function srand() + srand(GLOBAL_RNG) + dsfmt_gv_srand() +end + +function srand(seed::Union(Integer, Vector{UInt32})) + srand(GLOBAL_RNG, seed) + dsfmt_gv_srand() +end + +function srand(filename::AbstractString, n::Integer=4) + srand(GLOBAL_RNG, filename, n) + dsfmt_gv_srand() +end ## Global RNG