2015-10-29 50 views
6

在朱莉婭0.4.0,當我嘗試爲什麼rand不能使用AbstractFloat?

rand(AbstractFloat, 1) 

得到以下錯誤:

ERROR: MethodError: `rand` has no method matching rand(::MersenneTwister, 
::Type{AbstractFloat}) 

是否存在的事實,我必須明確地說Float32Float64rand工作背後的理由?或者僅僅是因爲語言相對較新,相關方法尚未在基地中定義?

+1

朱莉婭不知道你在'BigFloat','Float16','Float32'和'Float64'中喜歡哪種類型。 – Gnimuc

+1

但是,例如'one(AbstractFloat)'根據系統給出「Float32」或「Float64」對象。不應該'蘭特'有相同的行爲? – Taiki

+1

好的情況下,在我看來,對於朱莉婭來說,在類似的情況下表現得更好,就像上面那樣。 –

回答

4

onerand不同。 使用one(AbstractFloat)時,所有的輸出是「相同」:

julia> one(Float64) 
1.0 

julia> one(Float32) 
1.0f0 

julia> 1.0 == 1.0f0 
true 

這是不正確的使用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 

這意味着如果rand會表現得像one,人們可能會得到兩個不同的結果在兩臺不同的機器上具有相同的種子(例如一個是x86,另一個是x64)。看看代碼中random.jl

@inline蘭特【T <:聯盟{BOOL,INT8,UINT8,Int16的,UINT16,的Int32,UInt32的}}(R ::梅森旋轉算法,::類型【T })= rand_ui52_raw(r)的%T

rand(Signed) & rand(Unsigned)是非法的太。

+0

有趣,謝謝@Gnimuc –

+0

非常合理:)謝謝。 – Taiki