2011-05-13 13 views
5

rand(n)0 और n बीच की एक संख्या देता है। rand मेरे प्लेटफ़ॉर्म पर पूर्णांक सीमा तक सभी तर्कों के लिए "यादृच्छिकता" के संबंध में अपेक्षित कार्य करेगा?पर्ल की रैंड के लिए तर्क कितना बड़ा हो सकता है?

+2

अधिक जानकारी के लिए सूचना, मुझे यह दिलचस्प लगता है: http://wellington.pm.org/archive/200704/randomness/index.html – vol7ron

उत्तर

8

यह आपके randbits मूल्य पर निर्भर करने के लिए जा रहा है:

रैंड आपके सिस्टम के यादृच्छिक संख्या जनरेटर कॉल (या जो भी पर्ल की अपनी प्रतिलिपि में संकलित किया गया था)। इस चर्चा के लिए, मैं जेनरेटर रैंड को रैंड, पर्ल के फ़ंक्शन से अलग करने के लिए कॉल करूंगा। रैंड 0 से 2 ** रैंडबिट्स - 1, समेत एक पूर्णांक उत्पन्न करता है, जहां रैंडबिट एक छोटा पूर्णांक है। यह देखने के लिए कि यह आपके पर्ल में क्या है, 'perl -V: randbits' कमांड का उपयोग करें। सामान्य मान 15, 16, या 31.

जब आप तर्क तर्क के साथ रैंड को कॉल करते हैं, तो perl उस मान को पूर्णांक के रूप में लेता है और इस मान की गणना करता है।

     arg * RAND 
      rand(arg) = --------------- 
         2**randbits 

यह मान हमेशा आवश्यक सीमा में गिर जाएगा।

  0 <= rand(arg) < arg 

लेकिन जैसे आर्ग 2 की तुलना में बड़ा हो जाता है ** randbits, बातें समस्याग्रस्त हो जाते हैं। आइए एक ऐसी मशीन की कल्पना करें जहां randbits = 15 है, इसलिए रैंड 0..32767 से है। यही है, जब भी हम रैंड कहते हैं, हम 32768 संभावित मूल्यों में से एक प्राप्त करते हैं। इसलिए, जब हम रैंड (तर्क) कहते हैं, तो हमें 32768 संभावित मानों में से एक मिलता है।

+1

perl के भीतर से randbits तक पहुंचने के लिए, 'कॉन्फ़िगर का उपयोग करें; प्रिंट $ कॉन्फ़िगर :: कॉन्फ़िगर {'randbits'} '। अधिकांश अन्य प्लेटफार्मों के लिए एमएसडब्ल्यू 32, 48 के लिए रैंडबिट 15 है। – ysth

+1

@ysth भी perl -V है: randbits –

+1

हां, इसका जवाब में उल्लेख किया गया है, लेकिन यह उपयोग करने के लिए थोड़ा मूर्ख होगा ... – ysth

2

यह आपके सिस्टम (छद्म) यादृच्छिक संख्या जेनरेटर द्वारा उपयोग की जाने वाली बिट्स की संख्या पर निर्भर करता है। आप

use Config; 
my $randbits = $Config{randbits}; 

rand के माध्यम से

perl -V:randbits 

या एक कार्यक्रम के भीतर के माध्यम से इस मूल्य को खोजने के उत्पन्न कर सकते हैं 2^randbits अलग यादृच्छिक संख्या कर सकते हैं। जबकि आप 2^randbits से बड़ी संख्या उत्पन्न कर सकते हैं, आप श्रेणी [0, एन) में सभी पूर्णांक मान उत्पन्न नहीं कर सकते हैं जब N> 2^randbits। जिनमें से दो एक शक्ति नहीं हैं एन के

मान भी समस्या हो सकती है, के रूप में (पूर्णांक छोटा) यादृच्छिक मानों का वितरण काफी सपाट नहीं होगा। कुछ मूल्य थोड़ा अधिक प्रतिनिधित्व किए जाएंगे, दूसरों को थोड़ा कम प्रतिनिधित्व किया जाएगा।

यह ध्यान देने योग्य है कि randbits एक मामूली 15 विंडोज पर है लायक है। इसका मतलब है कि आप केवल 32768 (2 ** 15) विशिष्ट मान प्राप्त कर सकते हैं। आप rand करने के लिए कई कॉल करने और मूल्यों के संयोजन से स्थिति में सुधार कर सकते हैं:

use Config; 
use constant RANDBITS => $Config{randbits}; 
use constant RAND_MAX => 2**RANDBITS; 

sub double_rand { 
    my $max = shift || 1; 
    my $iv = 
      int rand(RAND_MAX) << RANDBITS 
     | int rand(RAND_MAX); 
    return $max * ($iv/2**(2*RANDBITS)); 
} 

मान लिया जाये कि randbits = 15, double_rand की नकल करता है randbits = 30, +१०७३७४१८२४ (2 ** 30) संभव विशिष्ट मान प्रदान करते हैं। यह उपरोक्त वर्णित दोनों समस्याओं को कम करता है (लेकिन कभी खत्म नहीं कर सकता)।

0

हम बड़े यादृच्छिक पूर्णांकों के बारे में और क्या यह उन्हें प्राप्त करने के लिए संभव है बात कर रहे हैं। यह ध्यान दिया जाना चाहिए कि दो यादृच्छिक पूर्णांक का समापन भी एक यादृच्छिक पूर्णांक है।तो अगर आपके सिस्टम, किसी भी कारण से, नहीं 999999999999 पार जा सकते हैं, तो बस

$bigrand = int(rand(999999999999)).int(rand(999999999999)); 

लिख सकते हैं और आप (अधिकतम) दो बार लंबाई के एक यादृच्छिक पूर्णांक मिल जाएगा।

(वास्तव में इस सवाल का "कितना बड़ा रैंड संख्या हो सकती है" बल्कि जवाब "आप में बड़ा रूप में आप चाहते हैं, बस कम संख्या जोड़ प्राप्त कर सकते हैं" करने के लिए संख्यात्मक जवाब नहीं है।)

+3

स्टैक ओवरफ़्लो में आपका स्वागत है। जो आप उत्तर के रूप में सुझाव दे रहे हैं वह दो मौजूदा उत्तरों में से एक द्वारा कवर किया गया है, और उत्तर के बजाय बेहतर है। यदि आप अपनी तकनीक का उपयोग करने जा रहे थे, तो आपको यह सुनिश्चित करना होगा कि संख्या का दूसरा भाग पर्याप्त शून्य से पूर्वनिर्धारित है। आपने उदाहरण में 12 अंक चुने हैं, जो कुछ मुद्दों का कारण बन सकता है; 9 अंक सुरक्षित होंगे। स्ट्रिंग उत्पन्न करने के लिए आपको शायद 'sprintf ("% d% 09d", रैंड (999_999_ 999), रैंड (999_999_ 999)) का उपयोग करने की आवश्यकता होगी। यहां तक ​​कि विंडोज़ पर भी समस्याग्रस्त हो सकता है; क्यों के लिए अन्य जवाब देखें। –

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