Skip to content

Commit 53875ee

Browse files
committed
faster randmtzig_exprnd (separate unlikely branch + @inline)
1 parent 713d736 commit 53875ee

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

base/random.jl

+16-13
Original file line numberDiff line numberDiff line change
@@ -984,20 +984,23 @@ randn(dims::Int...) = randn!(Array(Float64, dims...))
984984
randn(rng::MersenneTwister, dims::Dims) = randn!(rng, Array(Float64, dims))
985985
randn(rng::MersenneTwister, dims::Int...) = randn!(rng, Array(Float64, dims...))
986986

987-
function randmtzig_exprnd(rng::MersenneTwister=GLOBAL_RNG)
987+
@inline function randmtzig_exprnd(rng::MersenneTwister=GLOBAL_RNG)
988988
@inbounds begin
989-
while true
990-
ri = rand_ui52(rng)
991-
idx = ri & 0xFF
992-
x = ri*we[idx+1]
993-
if ri < ke[idx+1]
994-
return x # 98.9% of the time we return here 1st try
995-
elseif idx == 0
996-
return ziggurat_exp_r - log(rand(rng))
997-
elseif (fe[idx] - fe[idx+1])*rand(rng) + fe[idx+1] < exp(-x)
998-
return x # return from the triangular area
999-
end
1000-
end
989+
ri = rand_ui52(rng)
990+
idx = ri & 0xFF
991+
x = ri*we[idx+1]
992+
ri < ke[idx+1] && return x # 98.9% of the time we return here 1st try
993+
return randmtzig_exprnd_unlikely(rng, idx, x)
994+
end
995+
end
996+
997+
function randmtzig_exprnd_unlikely(rng, idx, x)
998+
@inbounds if idx == 0
999+
return ziggurat_exp_r - log(rand(rng))
1000+
elseif (fe[idx] - fe[idx+1])*rand(rng) + fe[idx+1] < exp(-x)
1001+
return x # return from the triangular area
1002+
else
1003+
return randmtzig_exprnd(rng)
10011004
end
10021005
end
10031006

0 commit comments

Comments
 (0)