@@ -216,9 +216,14 @@ rand(r::AbstractRNG, T::Type, d1::Integer, dims::Integer...) = rand(r, T, tuple(
216
216
# rand(r, ()) would match both this method and rand(r, dims::Dims)
217
217
# moreover, a call like rand(r, NotImplementedType()) would be an infinite loop
218
218
219
- function rand! {T} (r:: AbstractRNG , A:: AbstractArray{T} )
219
+ abstract Distribution
220
+ type TypeDistribution{T} <: Distribution end
221
+
222
+ @inline rand {T} (r:: AbstractRNG , :: TypeDistribution{T} ) = rand (r, T)
223
+
224
+ function rand! {T} (r:: AbstractRNG , A:: AbstractArray{T} , d:: Distribution = TypeDistribution {T} ())
220
225
for i = 1 : length (A)
221
- @inbounds A[i] = rand (r, T )
226
+ @inbounds A[i] = rand (r, d )
222
227
end
223
228
A
224
229
end
479
484
480
485
# rand on AbstractArray
481
486
482
- immutable Sampler{A<: AbstractArray ,G<: RangeGenerator }
487
+ immutable Sampler{A<: AbstractArray ,G<: RangeGenerator } <: Distribution
483
488
r:: A
484
489
g:: G
485
490
end
488
493
@inline rand (rng:: AbstractRNG , s:: Sampler ) = @inbounds return s. r[rand (rng, s. g)]
489
494
@inline rand {T<:Union(IntTypes..., BigInt)} (rng:: AbstractRNG , s:: Sampler{UnitRange{T}} ) = rand (rng, s. g, first (s. r))
490
495
491
- function rand! (rng:: AbstractRNG , A:: AbstractArray , s:: Sampler )
492
- for i = 1 : length (A)
493
- @inbounds A[i] = rand (rng, s)
494
- end
495
- return A
496
- end
497
-
498
496
499
497
# Randomly draw a sample from an AbstractArray r
500
498
# (e.g. r is a range 0:2:8 or a vector [2, 3, 5, 7])
@@ -1012,6 +1010,12 @@ const ziggurat_nor_inv_r = inv(ziggurat_nor_r)
1012
1010
const ziggurat_exp_r = 7.6971174701310497140446280481
1013
1011
1014
1012
1013
+ type Normal <: Distribution end
1014
+ type Exponential <: Distribution end
1015
+
1016
+ @inline rand (rng:: AbstractRNG , :: Normal ) = randn (rng)
1017
+ @inline rand (rng:: AbstractRNG , :: Exponential ) = randexp (rng)
1018
+
1015
1019
@inline function randn (rng:: AbstractRNG = GLOBAL_RNG)
1016
1020
@inbounds begin
1017
1021
r = rand_ui52 (rng)
@@ -1038,19 +1042,14 @@ function randn_unlikely(rng, idx, rabs, x)
1038
1042
end
1039
1043
end
1040
1044
1041
- function randn! (rng:: AbstractRNG , A:: Array{Float64} )
1042
- for i = 1 : length (A)
1043
- @inbounds A[i] = randn (rng)
1044
- end
1045
- A
1046
- end
1047
-
1045
+ randn! (rng:: AbstractRNG , A:: Array{Float64} ) = rand! (rng, A, Normal ())
1048
1046
randn! (A:: Array{Float64} ) = randn! (GLOBAL_RNG, A)
1049
1047
randn (dims:: Dims ) = randn! (Array (Float64, dims))
1050
1048
randn (dims:: Integer... ) = randn! (Array (Float64, dims... ))
1051
1049
randn (rng:: AbstractRNG , dims:: Dims ) = randn! (rng, Array (Float64, dims))
1052
1050
randn (rng:: AbstractRNG , dims:: Integer... ) = randn! (rng, Array (Float64, dims... ))
1053
1051
1052
+
1054
1053
@inline function randexp (rng:: AbstractRNG = GLOBAL_RNG)
1055
1054
@inbounds begin
1056
1055
ri = rand_ui52 (rng)
@@ -1071,13 +1070,8 @@ function randexp_unlikely(rng, idx, x)
1071
1070
end
1072
1071
end
1073
1072
1074
- function randexp! (rng:: AbstractRNG , A:: Array{Float64} )
1075
- for i = 1 : length (A)
1076
- @inbounds A[i] = randexp (rng)
1077
- end
1078
- A
1079
- end
1080
1073
1074
+ randexp! (rng:: AbstractRNG , A:: Array{Float64} ) = rand! (rng, A, Exponential ())
1081
1075
randexp! (A:: Array{Float64} ) = randexp! (GLOBAL_RNG, A)
1082
1076
randexp (dims:: Dims ) = randexp! (Array (Float64, dims))
1083
1077
randexp (dims:: Int... ) = randexp! (Array (Float64, dims))
0 commit comments