2012-05-23 13 views
10

में सबसे संभावित बिट्स मैंने इस तरह के प्रयोग किए हैं - सी और सी # से 10 मिलियन यादृच्छिक संख्याएं बनाई हैं। और फिर गिनती है कि यादृच्छिक पूर्णांक में 15 बिट्स से प्रत्येक बिट कितनी बार सेट है। (मैंने 15 बिट्स चुना क्योंकि सी केवल 0x7fff तक यादृच्छिक पूर्णांक का समर्थन करता है)।यादृच्छिक पूर्णांक

मैं क्या मिल गया है यह है: enter image description here
मैं दो प्रश्न:

  1. क्यों 3 सबसे संभावित बिट्स कर रहे हैं? C मामले बिट्स 8,10,12 में सबसे अधिक संभावना है। और C# बिट्स 6,8,11 सबसे संभावित हैं।

  2. यह भी लगता है कि सी # सबसे संभावित बिट्स अधिकतर सी सबसे अधिक संभावित बिट्स की तुलना में 2 पदों से स्थानांतरित हो जाती हैं। ऐसा क्यों है ? क्योंकि सी # अन्य RAND_MAX निरंतर उपयोग करता है या क्या?


C के लिए मेरे परीक्षण कोड:

void accumulateResults(int random, int bitSet[15]) { 
    int i; 
    int isBitSet; 
    for (i=0; i < 15; i++) { 
     isBitSet = ((random & (1<<i)) != 0); 
     bitSet[i] += isBitSet; 
    } 
} 

int main() { 
    int i; 
    int bitSet[15] = {0}; 
    int times = 10000000; 
    srand(0); 

    for (i=0; i < times; i++) { 
     accumulateResults(rand(), bitSet); 
    } 

    for (i=0; i < 15; i++) { 
     printf("%d : %d\n", i , bitSet[i]); 
    } 

    system("pause"); 
    return 0; 
} 

और परीक्षण कोड C# के लिए:

static void accumulateResults(int random, int[] bitSet) 
{ 
    int i; 
    int isBitSet; 
    for (i = 0; i < 15; i++) 
    { 
     isBitSet = ((random & (1 << i)) != 0) ? 1 : 0; 
     bitSet[i] += isBitSet; 
    } 
} 

static void Main(string[] args) 
{ 
    int i; 
    int[] bitSet = new int[15]; 
    int times = 10000000; 
    Random r = new Random(); 

    for (i = 0; i < times; i++) 
    { 
     accumulateResults(r.Next(), bitSet); 
    } 

    for (i = 0; i < 15; i++) 
    { 
     Console.WriteLine("{0} : {1}", i, bitSet[i]); 
    } 

    Console.ReadKey(); 
} 

बहुत धन्यवाद !! Btw, ओएस विंडोज 7, 64-बिट वास्तुकला & विजुअल स्टूडियो 2010

संपादित
@ दाऊद हेफेरनान को बहुत धन्यवाद है। मैंने यहां कई गलतियां की हैं:

  1. सी और सी # कार्यक्रमों में बीज अलग था (सी शून्य और सी # - वर्तमान समय का उपयोग कर रहा था)।
  2. मैंने परिणामों की पुनरुत्पादन के लिए Times परिवर्तनीय के विभिन्न मानों के साथ प्रयोग करने की कोशिश नहीं की।

यहाँ जब विश्लेषण किया कैसे संभावना है कि पहली बिट सेट कर दिया जाता यादृच्छिक समय की संख्या पर निर्भर करता है() कहा जाता था मैं क्या मिल गया है: enter image description here
तो के रूप में कई देखा - परिणाम प्रतिलिपि प्रस्तुत करने योग्य नहीं हैं और नहीं होना चाहिए गंभीरता से लिया। (पुष्टि के कुछ रूप के अलावा कि सी/सी # पीआरएनजी पर्याप्त अच्छे हैं :-))।

+2

मुझे स्कूल में अपने आंकड़े कक्षाओं से बहुत कुछ याद नहीं है, लेकिन आपको यह पता लगाना होगा कि आउटलाइजर्स सांख्यिकीय रूप से हैं या नहीं महत्वपूर्ण या बस यादृच्छिक त्रुटि का परिणाम। आपको कभी भी एक परिपूर्ण वितरण नहीं मिल रहा है। –

+3

क्या ये परिणाम पुनरुत्पादित हैं? वह मुझे आश्चर्यचकित करेगा। यदि आप एक ही परीक्षण को कई बार चलाते हैं, तो मुझे संदेह है कि बाद के रनों पर, अलग-अलग बिट्स "अधिक संभावित" और "कम संभव" हो जाएंगे। – abelenky

+0

मुझे कोई संदेह नहीं है कि वे पुनरुत्पादित हैं। 'रैंड' को आम तौर पर एक रैखिक संगत पीआरएनजी के साथ कार्यान्वित किया जाता है, जिसमें हास्यास्पद रूप से खराब सांख्यिकीय गुण होते हैं। 'रैंड' से उचित परिणाम प्राप्त करने की आपकी सबसे अच्छी उम्मीद केवल प्रत्येक कॉल से एक बिट (उच्च बिट) का उपयोग करना है, और इसे बार-बार कॉल करें ... –

उत्तर

10

यह सामान्य या उद्यान नमूना भिन्नता है।

एक प्रयोग की कल्पना करें जहां आप बार-बार सिक्का टॉस करते हैं। आप हर बार पांच सिर पाने की उम्मीद नहीं करेंगे। यह भिन्नता नमूना करने के लिए नीचे है।

वैसे ही, आपका प्रयोग नमूना भिन्नता के अधीन होगा। प्रत्येक बिट एक ही सांख्यिकीय वितरण का पालन करता है। लेकिन नमूनाकरण भिन्नता का अर्थ है कि आप 0 और 1 के बीच सटीक 50/50 विभाजन की उम्मीद नहीं करेंगे।

अब, आपकी साजिश आपको सोचने में भ्रामक है कि भिन्नता किसी भी तरह महत्वपूर्ण है या इसका अर्थ है।

enter image description here

RNG एकदम सही ढंग से बर्ताव करता है, तो प्रत्येक बिट होगा: आप ग्राफ इस तरह दिखता है यही कारण है कि इस बात का एक बेहतर समझ पाने चाहते हैं, तो आप 0. पर शुरू ग्राफ के Y अक्ष साजिश रची संभाव्यता 0.5 के साथ binomial distribution का पालन करें। इस वितरण में भिन्नता एनपी (1 - पी) है। आपके प्रयोग के लिए यह 2.5 मिलियन का अंतर प्रदान करता है। लगभग 1,500 के मानक विचलन प्राप्त करने के लिए वर्ग रूट लें। तो आप बस अपने परिणामों का निरीक्षण करने से देख सकते हैं, कि आप जो भिन्नता देखते हैं वह स्पष्ट रूप से साधारण से बाहर नहीं है। आपके पास 15 नमूने हैं और वास्तविक अर्थ से 1.6 मानक विचलन से अधिक नहीं हैं। इसके बारे में चिंता करने के लिए कुछ भी नहीं है।

आपने परिणामों में रुझानों को समझने का प्रयास किया है। आपने कहा है कि "3 सबसे संभावित बिट्स" हैं। यह केवल इस नमूने की आपकी विशेष व्याख्या है। अपने आरएनजी के लिए अलग-अलग बीजों के साथ अपने प्रोग्राम फिर से चलाने का प्रयास करें और आपके पास ग्राफ होंगे जो थोड़ा अलग दिखेंगे। उनके पास अभी भी वही गुणवत्ता होगी। कुछ बिट्स दूसरों की तुलना में अधिक सेट हैं। लेकिन कोई स्पष्ट पैटर्न नहीं होगा, और जब आप उन्हें उस ग्राफ पर प्लॉट करेंगे जिसमें 0 शामिल है, तो आप क्षैतिज रेखाएं देखेंगे।

उदाहरण के लिए, यहां आपका सी प्रोग्राम 98723498734 के यादृच्छिक बीज के लिए आउटपुट करता है।

enter image description here

मुझे लगता है कि यह कुछ और परीक्षणों को चलाने के लिए आप को मनाने के लिए पर्याप्त होना चाहिए। जब आप ऐसा करते हैं तो आप देखेंगे कि कोई विशेष बिट नहीं है जिसे पसंदीदा उपचार दिया जाता है।

+0

+1 के साथ बाहर आया। लेकिन कोई उम्मीद करेगा कि 'एन' अनंतता के लिए जाता है, तो अपेक्षित अनुपात 50% पर अभिसरण होगा। –

+0

@ ओली हां, लेकिन यहां हमारे पास 'एन' है जो सीमित है। और इसलिए नमूना भिन्नता हमेशा होती है। –

+0

बहुत अच्छी सांख्यिकीय व्याख्या के लिए धन्यवाद। हालांकि आंकड़े ठोस प्रयोग परिणामों के 'कारणों' की व्याख्या नहीं करते हैं। और परिणाम के कारण यह है कि इस प्रश्न में मेरे लिए सबसे दिलचस्प क्या है। 'क्या मैं कह सकता हूं कि यादृच्छिक() के लिए सटीक बीज सेट करने के लिए पसंदीदा बिट्स का कारण बनता है?' (यह छद्म यादृच्छिकता "PSEUDO" भाग समझाएगा) –

2

आप जानते हैं कि विचलन लगभग 2500/5,000,000 है, जो 0,05% तक आता है?

+3

और इस परिकल्पना के तहत कि हर बिट वास्तव में समान रूप से यादृच्छिक है, भिन्नता 'n * p * q = n/4' है, जिसका अर्थ है कि 5 मिलियन में 2500 2 और थोड़ा मानक विचलन है। –

+0

मेरा मतलब यह नहीं था [सांख्यिकीय तरीके से विचलन] (http://en.wikipedia.org/wiki/Deviation_ (आंकड़े)) (क्योंकि मैं शायद ही कभी इस विषय को छूता हूं और मुश्किल से इसके बारे में कुछ भी जानता हूं), लेकिन धन्यवाद परिशिष्ट के लिए। – CodeCaster

+0

मैंने इसे 500000000 पुनरावृत्तियों के साथ चलाया, और ~ 0.003% – paul

1

ध्यान दें कि प्रत्येक बिट की आवृत्ति का अंतर केवल 0.08% (-0.03% से + 0.05%) तक भिन्न होता है। मुझे नहीं लगता कि मैं उस महत्वपूर्ण पर विचार करूंगा। यदि हर बिट बिल्कुल समान रूप से संभव था, तो मुझे कुछ हद तक संदिग्ध होने के बजाय पीआरएनजी बहुत संदिग्ध लगेगा। आपको उन प्रक्रियाओं में भिन्नता के कुछ स्तर की अपेक्षा करनी चाहिए जिन्हें कम से कम मॉडलिंग यादृच्छिकता माना जाता है ...

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