在朱莉娅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)
有没有这样的事实,我必须明确地说,后面的原因Float32或Float64为rand工作?或者仅仅是因为语言相对较新,相关方法尚未在基地定义?
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)也是非法的。