लघु जवाब: सीमा [0, 1) है।
हां। एक Float
के लिए Random
के कार्यान्वयन [source] है:
instance Random Float where
randomR = randomRFloating
random rng =
-- TODO: Faster to just use 'next' IF it generates enough bits of randomness.
case random rng of
(x,rng') ->
-- We use 24 bits of randomness corresponding to the 24 bit significand:
((fromIntegral (mask24 .&. (x::Int32)) :: Float)
/fromIntegral twoto24, rng')
-- Note, encodeFloat is another option, but I'm not seeing slightly
-- worse performance with the following [2011.06.25]:
-- (encodeFloat rand (-24), rng')
where
mask24 = twoto24 - 1
twoto24 = (2::Int32)^(24::Int32)
यह एक यादृच्छिक 32-बिट पूर्णांक x
(जहां शून्य का संभावित मान है), यह पता पहले 8 बिट मास्क का उपयोग, और 2 से है कि मूल्य बांटता। नतीजतन सीमा 0 (शामिल) 1 तक (बाहर रखा गया) है। इसका प्रतिनिधित्व करने वाला सबसे बड़ा मूल्य 0.999999940395
है।
कारण यह काम करता है क्योंकि Float
में 24-बिट मैंटिस (साथ ही 7-बिट एक्सपोनेंट और साइन बिट) है। उस सीमा में इसे बदलकर, हम गारंटी देते हैं कि प्रत्येक Float
मान समान रूप से संभावित है: अंतिम 24 बिट्स को पहले Float
के मंत्र में कॉपी किया गया है, तो फ्लोट सामान्यीकृत है, और एक्सपोनेंट बदल गया है कि मान [0] में हैं , 1) रेंज।
स्रोत
2017-12-15 11:25:13
विस्तृत उत्तर के लिए धन्यवाद, मुझे यह भी पता नहीं था कि आप स्रोत तक पहुंच सकते हैं! – flawr