为什么rand不能使用AbstractFloat?

Tai*_*iki 6 julia

在朱莉娅0.4.0,当我尝试

rand(AbstractFloat, 1)
Run Code Online (Sandbox Code Playgroud)

获得以下错误:

ERROR: MethodError: `rand` has no method matching rand(::MersenneTwister,
::Type{AbstractFloat})
Run Code Online (Sandbox Code Playgroud)

有没有这样的事实,我必须明确地说,后面的原因Float32Float64rand工作?或者仅仅是因为语言相对较新,相关方法尚未在基地定义?

Gni*_*muc 4

one不同于rand. 使用时one(AbstractFloat),所有输出都是“相同的”:

julia> one(Float64)
1.0

julia> one(Float32)
1.0f0

julia> 1.0 == 1.0f0
true
Run Code Online (Sandbox Code Playgroud)

使用时这是不正确的rand

julia> rand(srand(1), Float64)
0.23603334566204692

julia> rand(srand(1), Float32)
0.5479944f0

julia> rand(srand(1), Float32) == rand(srand(1), Float64)
false
Run Code Online (Sandbox Code Playgroud)

这意味着如果rand行为类似one,则在两台不同的机器上使用相同的种子可能会得到两个不同的结果(例如,一台是 x86,另一台是 x64)。看一下random.jl中的代码:

@inline rand{T<:Union{Bool, Int8, UInt8, Int16, UInt16, Int32, UInt32}}(r::MersenneTwister, ::Type{T}) = rand_ui52_raw(r) % T

两者rand(Signed)&rand(Unsigned)也是非法的。