2017-12-15 103 views
5

मुझे लगता है कि randomIO::IO Float समान रूप से वितरित Float संख्याओं का उत्पादन करता है, लेकिन मेरा प्रश्न किस सीमा में है? क्या यह [0,1], (0,1) या बीच में कुछ भी है ([0,1) या (0,1])?क्या randomio (System.Random से) कभी 0 उत्पन्न करता है?

मुझे hackage पर इसके बारे में कुछ भी नहीं मिला, और संदर्भित पेपर एक भुगतान के पीछे है।

कारण मैं पूछ रहा हूं क्योंकि आप यादृच्छिक संख्या को बदलना चाहते हैं, और यदि आप 1/myRandomNumber का मूल्यांकन करना चाहते हैं तो यह जानना उपयोगी होगा कि आप कभी भी Infinity में भाग लेंगे या नहीं।

import System.Random 
main=(randomIO::IO Float)>>=print 

Try it online!

उत्तर

9

लघु जवाब: सीमा [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) रेंज।

+1

विस्तृत उत्तर के लिए धन्यवाद, मुझे यह भी पता नहीं था कि आप स्रोत तक पहुंच सकते हैं! – flawr

संबंधित मुद्दे