@@ -35,9 +35,11 @@ julia> randn(rng, ComplexF32, (2, 3))
35
35
0.611224+1.56403im 0.355204-0.365563im 0.0905552+1.31012im
36
36
```
37
37
"""
38
- @inline function randn (rng:: AbstractRNG = default_rng ())
38
+ @inline randn (rng:: AbstractRNG = default_rng ()) = _randn (rng, rand (rng, UInt52Raw ()))
39
+
40
+ @inline function _randn (rng:: AbstractRNG , r:: UInt64 )
39
41
@inbounds begin
40
- r = rand (rng, UInt52 ())
42
+ r &= 0x000fffffffffffff
41
43
rabs = Int64 (r>> 1 ) # One bit for the sign
42
44
idx = rabs & 0xFF
43
45
x = ifelse (r % Bool, - rabs, rabs)* wi[idx+ 1 ]
@@ -95,9 +97,11 @@ julia> randexp(rng, 3, 3)
95
97
0.695867 0.693292 0.643644
96
98
```
97
99
"""
98
- function randexp (rng:: AbstractRNG = default_rng ())
100
+ randexp (rng:: AbstractRNG = default_rng ()) = _randexp (rng, rand (rng, UInt52Raw ()))
101
+
102
+ function _randexp (rng:: AbstractRNG , ri:: UInt64 )
99
103
@inbounds begin
100
- ri = rand (rng, UInt52 ())
104
+ ri &= 0x000fffffffffffff
101
105
idx = ri & 0xFF
102
106
x = ri* we[idx+ 1 ]
103
107
ri < ke[idx+ 1 ] && return x # 98.9% of the time we return here 1st try
@@ -162,6 +166,7 @@ function randexp! end
162
166
163
167
for randfun in [:randn , :randexp ]
164
168
randfun! = Symbol (randfun, :! )
169
+ _randfun = Symbol (:_ , randfun)
165
170
@eval begin
166
171
# scalars
167
172
$ randfun (rng:: AbstractRNG , T:: BitFloatType ) = convert (T, $ randfun (rng))
@@ -175,6 +180,21 @@ for randfun in [:randn, :randexp]
175
180
A
176
181
end
177
182
183
+ # optimization for MersenneTwister, which randomizes natively Array{Float64}
184
+ function $randfun! (rng:: MersenneTwister , A:: Array{Float64} )
185
+ if length (A) < 13
186
+ for i in eachindex (A)
187
+ @inbounds A[i] = $ randfun (rng, Float64)
188
+ end
189
+ else
190
+ rand! (rng, A, CloseOpen12 ())
191
+ for i in eachindex (A)
192
+ @inbounds A[i] = $ _randfun (rng, reinterpret (UInt64, A[i]))
193
+ end
194
+ end
195
+ A
196
+ end
197
+
178
198
$ randfun! (A:: AbstractArray ) = $ randfun! (default_rng (), A)
179
199
180
200
# generating arrays
0 commit comments