@@ -5,9 +5,10 @@ using Base.dSFMT
5
5
export srand,
6
6
rand, rand!,
7
7
randn, randn!,
8
+ randexp, randexp!,
8
9
randbool,
9
- AbstractRNG, RNG, MersenneTwister,
10
- randmtzig_exprnd
10
+ AbstractRNG, RNG, MersenneTwister
11
+
11
12
12
13
abstract AbstractRNG
13
14
@@ -984,23 +985,40 @@ randn(dims::Int...) = randn!(Array(Float64, dims...))
984
985
randn (rng:: MersenneTwister , dims:: Dims ) = randn! (rng, Array (Float64, dims))
985
986
randn (rng:: MersenneTwister , dims:: Int... ) = randn! (rng, Array (Float64, dims... ))
986
987
987
- function randmtzig_exprnd (rng:: MersenneTwister = GLOBAL_RNG)
988
+ @inline function randexp (rng:: MersenneTwister = GLOBAL_RNG)
988
989
@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
990
+ ri = rand_ui52 (rng)
991
+ idx = ri & 0xFF
992
+ x = ri* we[idx+ 1 ]
993
+ ri < ke[idx+ 1 ] && return x # 98.9% of the time we return here 1st try
994
+ return randexp_unlikely (rng, idx, x)
995
+ end
996
+ end
997
+
998
+ function randexp_unlikely (rng, idx, x)
999
+ @inbounds if idx == 0
1000
+ return ziggurat_exp_r - log (rand (rng))
1001
+ elseif (fe[idx] - fe[idx+ 1 ])* rand (rng) + fe[idx+ 1 ] < exp (- x)
1002
+ return x # return from the triangular area
1003
+ else
1004
+ return randexp (rng)
1005
+ end
1006
+ end
1007
+
1008
+ function randexp! (rng:: MersenneTwister , A:: Array{Float64} )
1009
+ for i = 1 : length (A)
1010
+ @inbounds A[i] = randexp (rng)
1001
1011
end
1012
+ A
1002
1013
end
1003
1014
1015
+ randexp! (A:: Array{Float64} ) = randexp! (GLOBAL_RNG, A)
1016
+ randexp (dims:: Dims ) = randexp! (Array (Float64, dims))
1017
+ randexp (dims:: Int... ) = randexp! (Array (Float64, dims))
1018
+ randexp (rng:: MersenneTwister , dims:: Dims ) = randexp! (rng, Array (Float64, dims))
1019
+ randexp (rng:: MersenneTwister , dims:: Int... ) = randexp! (rng, Array (Float64, dims))
1020
+
1021
+
1004
1022
# # random UUID generation
1005
1023
1006
1024
immutable UUID
0 commit comments