मुझे यादृच्छिकता का परीक्षण कैसे करना चाहिए?


127

किसी सरणी में तत्वों को बेतरतीब ढंग से फेरबदल करने की विधि पर विचार करें। आप यह सुनिश्चित करने के लिए एक सरल लेकिन मजबूत इकाई परीक्षण कैसे लिखेंगे कि यह काम कर रहा है?

मैं दो विचारों के साथ आया हूं, जिनमें से दोनों में ध्यान देने योग्य दोष हैं:

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

एक दूसरे फ़ंक्शन पर विचार करें जो पासा रोल को अनुकरण करता है और एक यादृच्छिक संख्या देता है। आप इस फ़ंक्शन का परीक्षण कैसे करेंगे? आप कैसे परीक्षण करेंगे कि फ़ंक्शन ...

  • दिए गए सीमा के बाहर एक संख्या कभी नहीं लौटाता है?
  • वैध वितरण में संख्या देता है? (एक डाई के लिए वर्दी, बड़ी संख्या में पासा के लिए सामान्य।)

मैं न केवल इन उदाहरणों बल्कि सामान्य रूप से कोड के यादृच्छिक तत्वों के परीक्षण में अंतर्दृष्टि प्रदान करने वाले उत्तरों की तलाश कर रहा हूं। क्या इकाई परीक्षण यहां भी सही समाधान हैं? यदि नहीं, तो किस प्रकार के परीक्षण हैं?


बस हर किसी के दिमाग को शांत करने के लिए मैं अपना रैंडम नंबर जनरेटर नहीं लिख रहा हूं ।


35
तंग युग्मन अपना सिर दिखाता है। उस ऑब्जेक्ट में पास करें जो यादृच्छिक संख्याओं को उत्पन्न करता है। फिर परीक्षण के दौरान आप एक ऑब्जेक्ट पास कर सकते हैं जो संख्याओं का एक निर्दिष्ट सेट उत्पन्न करता है जिसके लिए आप जानते हैं कि फेरबदल के बाद डेक कैसा दिखता है। आप अपने यादृच्छिक संख्या जनरेटर की यादृच्छिकता का अलग से परीक्षण कर सकते हैं।
मार्टिन यॉर्क

1
मैं फेरबदल (जावा कलेक्शंस। शफ़ल () या इसी तरह) के लिए मौजूदा लाइब्रेरी रूटीन का उपयोग करने पर दृढ़ता से विचार करूंगा। एक त्रुटिपूर्ण फेरबदल एल्गोरिथ्म लिखने के बारे में डेवलपर . com/tech/article.php/616221/… पर पढ़ा जाना चाहिए । डी 6 () फ़ंक्शन लिखने के लिए, कोई यह आश्वस्त होने के लिए पर्याप्त परीक्षण करेगा कि यह एक नंबर की सीमा से बाहर नहीं निकलेगा और फिर वितरण पर एक ची स्क्वैयर परीक्षण करेगा (chi squared बल्कि छद्म यादृच्छिक क्रम के प्रति संवेदनशील होने के कारण)। धारावाहिक सहसंबंध गुणांक को भी देखें।

"यह रैंडम फ़ंक्शन पर निर्भर करता है, हमेशा समान बीज दिए गए समान मानों को लौटाता है। हालांकि, यह कभी-कभी एक अमान्य धारणा है।" मैंने लिंक का अनुसरण किया, और मैं अमान्य धारणा नहीं देख रहा हूं। यह स्पष्ट रूप से कहता है: "यदि एक ही बीज का बार-बार उपयोग किया जाता है, तो समान संख्याओं की श्रृंखला उत्पन्न होती है।"
Kyralessa

@Kyralessa "रैंडम क्लास में रैंडम नंबर जनरेटर का कार्यान्वयन .NET फ्रेमवर्क के प्रमुख संस्करणों में समान रहने की गारंटी नहीं है।" इसलिए बहुत बड़ी चिंता नहीं, लेकिन फिर भी कुछ पर विचार करना चाहिए।
dlras2

4
@Kyralessa मैंने उस उद्धरण के महत्वपूर्ण आधे हिस्से को याद किया: "परिणामस्वरूप, आपके एप्लिकेशन कोड को यह नहीं मानना ​​चाहिए कि उसी बीज का .NET .NET फ्रेमवर्क के विभिन्न संस्करणों में समान छद्म यादृच्छिक अनुक्रम होगा।"
dlras2

जवाबों:


102

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

सौभाग्य से, बहुत सारे सांख्यिकीय परीक्षण हैं जिन्हें आप चला सकते हैं, जैसे कि रैंडमनेस के टेस्ट की डाहरड बैटरी । यह सभी देखें:

  1. यूनिट एक छद्म यादृच्छिक संख्या जनरेटर का परीक्षण कैसे करें?

    • स्टीव जेसोप आपको सलाह देता है कि आप उसी आरएनजी एल्गोरिथ्म का एक परीक्षण कार्यान्वित करें जो आप उपयोग कर रहे हैं और अपने स्वयं के कार्यान्वयन के खिलाफ चयनित बीजों के साथ इसके उत्पादन की तुलना करें।
    • ग्रेग हेगिल सांख्यिकीय परीक्षणों के ईएनटी सूट की सिफारिश करता है ।
    • जॉन डी। कुक अपने कोडप्रोजेक्ट लेख सिंपल रैंडम नंबर जनरेशन के पाठकों को संदर्भित करते हैं , जिसमें डोनाल्ड नथ के वॉल्यूम 2, सेमिनुमेरिकल एल्गोरिदम में उल्लिखित कोलमोगोरोव-स्मिरनोव परीक्षण का कार्यान्वयन शामिल है।
    • कई लोग परीक्षण की सलाह देते हैं कि उत्पन्न संख्याओं का वितरण एक समान है, ची-स्क्वेर्ड परीक्षण, और परीक्षण है कि माध्य और मानक विचलन अपेक्षित सीमा के भीतर हैं। (ध्यान दें कि अकेले वितरण का परीक्षण करना पर्याप्त नहीं है। [1,2,3,4,5,6,7,8] एक समान वितरण है, लेकिन यह निश्चित रूप से यादृच्छिक है।)
  2. यादृच्छिक परिणामों को लौटाने वाले कार्यों के साथ यूनिट परीक्षण

    • ब्रायन जेनिसियो बताते हैं कि आपके परीक्षणों को दोहराने योग्य बनाने के लिए आपका RNG का मज़ाक उड़ाना एक विकल्प है, और C # नमूना कोड प्रदान करता है।
    • फिर से, कई और लोग पुनरावृत्ति के लिए निश्चित बीज मूल्यों और समान वितरण के लिए सरल परीक्षणों का उपयोग करने की ओर इशारा करते हैं, ची-स्क्वॉयड, आदि।
  3. यूनिट टेस्टिंग रैंडमनेस एक विकी लेख है जो कि पहले से ही परीक्षण की कोशिश कर रहे कई चुनौतियों के बारे में बात करता है, जो कि इसकी प्रकृति द्वारा, दोहराए जाने योग्य नहीं है। एक दिलचस्प बात यह है कि मैं इसे से दूर था निम्नलिखित था:

    मैंने winzip को पहले मानों की फ़ाइल की यादृच्छिकता को मापने के लिए एक उपकरण के रूप में उपयोग किया है (जाहिर है, छोटा यह फ़ाइल को कम यादृच्छिक रूप से संपीड़ित कर सकता है)।


सांख्यिकीय यादृच्छिकता के लिए एक और अच्छा परीक्षण सूट है ' एनट्री ' जो फोरमिलब.चक्र / आयामी में पाया जाता है ।

1
क्या आप उत्तर की पूर्णता के लिए आपके द्वारा पोस्ट किए गए कुछ लिंक को संक्षेप में बता सकते हैं?
dlras2

@DanRasmussen ज़रूर, मेरे पास सप्ताहांत में ऐसा करने का समय होगा।
छिपकली का बिल

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

2
डैंडर में रैंडमनेस के टेस्ट के प्रसिद्ध डार्टहार्ड बैटरी का एक अद्यतन संस्करण है, जिसमें राष्ट्रीय मानक और प्रौद्योगिकी संस्थान (एनआईएसटी) द्वारा विकसित सांख्यिकीय टेस्ट सूट (एसटीएस) शामिल है। यह उबंटू में तैयार-टू-रन और संभवतः अन्य डिस्ट्रोस के लिए उपलब्ध है
nealmcb

21

1. यूनिट अपने एल्गोरिथ्म का परीक्षण करें

पहले प्रश्न के लिए, मैं एक नकली वर्ग बनाऊंगा जिसे आप यादृच्छिक संख्याओं का एक क्रम खिलाते हैं जिसके लिए आप अपने एल्गोरिथ्म के परिणाम को जानते हैं। इस तरह से आप सुनिश्चित करें कि आप अपने यादृच्छिक फ़ंक्शन कार्यों के शीर्ष पर जो एल्गोरिथ्म बनाते हैं । तो कुछ की तर्ज पर:

Random r = new RandomStub([1,3,5,3,1,2]);
r.random(); //returns 1
r.random(); //returns 3
...

2. देखें कि क्या आपका यादृच्छिक कार्य समझ में आता है

इकाई परीक्षण के लिए आपको एक परीक्षण जोड़ना चाहिए जो कई बार चलता है और परिणाम का दावा करता है

  • आपके द्वारा निर्धारित सीमाओं के भीतर (इसलिए, एक पासा रोल 1 और 6 के बीच है) और
  • एक समझदार वितरण दिखाएं (कई परीक्षण चलाएं और देखें कि क्या वितरण आपकी अपेक्षा के x% के भीतर है, जैसे कि पासा रोल के लिए आपको 210% और 20% (1/6 = 16.67%) के बीच आना चाहिए । यह देखते हुए कि आपने इसे 1000 बार लुढ़काया है)।

3. एल्गोरिथ्म और यादृच्छिक फ़ंक्शन के लिए एकीकरण परीक्षण

मूल छंटाई में आप कितनी बार अपने सरणी की उम्मीद करेंगे? कुछ सौ बार क्रमबद्ध करें और यह बताएं कि छँटाई के समय का केवल x% परिवर्तन नहीं होता है।

यह वास्तव में पहले से ही एक एकीकरण परीक्षण है, आप यादृच्छिक फ़ंक्शन के साथ एल्गोरिथ्म का परीक्षण कर रहे हैं। एक बार जब आप असली यादृच्छिक फ़ंक्शन का उपयोग कर रहे होते हैं, तो आप एकल परीक्षण रन के साथ दूर नहीं हो सकते।

अनुभव से (मैंने एक आनुवंशिक एल्गोरिथ्म लिखा) मैं कहूंगा कि आपके एल्गोरिदम की इकाई परीक्षण का संयोजन, आपके यादृच्छिक फ़ंक्शन का वितरण परीक्षण और एकीकरण परीक्षण जाने का रास्ता है।


14

PRNGs का एक पहलू जो यह भूल जाता है कि इसके सभी गुण प्रकृति में सांख्यिकीय हैं: आप यह उम्मीद नहीं कर सकते कि किसी सरणी को फेरबदल करने से आपके द्वारा शुरू किए गए एक अलग क्रमचय में परिणाम होगा। मूल रूप से, यदि आप एक सामान्य PRNG का उपयोग कर रहे हैं, तो केवल एक चीज जो आप की गारंटी है वह यह है कि यह एक साधारण पैटर्न (उम्मीद) का उपयोग नहीं करता है और यह संख्याओं के सेट के बीच वितरण भी करता है जो यह देता है।

PRNG के लिए एक उचित परीक्षण में इसे कम से कम 100 बार चलाना और फिर आउटपुट के वितरण की जाँच करना शामिल है (जो प्रश्न के दूसरे भाग का सीधा उत्तर है)।

पहले प्रश्न का उत्तर लगभग समान है: परीक्षण को {1, 2, ..., n} के साथ लगभग 100 बार चलाएं और प्रत्येक स्थिति में प्रत्येक तत्व की संख्या की गणना करें। यदि फेरबदल विधि किसी भी अच्छी है, तो उन्हें लगभग सभी बराबर होना चाहिए।

एक पूरी तरह से अलग मामला है कि क्रिप्टोग्राफी-ग्रेड PRNGs का परीक्षण कैसे किया जाए। यह एक ऐसा मामला है जिसमें आपको संभवतः नहीं रहना चाहिए, जब तक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। लोगों को नष्ट करने के लिए जाना जाता है (पढ़ें: खुले भयावह छेद) केवल कुछ 'अनुकूलन' या तुच्छ संपादन के साथ अच्छे क्रिप्टोकरंसी।

संपादित करें: मैंने पूरी तरह से सवाल, शीर्ष उत्तर और अपने खुद के बारे में बताया है। जबकि मैं अभी भी जो बिंदु खड़ा करता हूं, मैं बिल द छिपकली का जवाब दूंगा। इकाई परीक्षण उनके स्वभाव में बूलियन हैं - वे या तो विफल हो जाते हैं, या वे सफल होते हैं, और इसलिए "PRNG (या एक PRNG का उपयोग करने का एक तरीका) के गुणों का परीक्षण करने के लिए अनुपयुक्त हैं, क्योंकि इस प्रश्न का कोई भी उत्तर मात्रात्मक होगा। बल्कि ध्रुवीय है।


1
मुझे लगता है कि आपका मतलब है कि प्रत्येक स्थिति में प्रत्येक तत्व की संख्या लगभग बराबर होनी चाहिए । यदि वे लगातार बराबर हैं, तो कुछ बहुत गलत है।
अष्टक

@octern धन्यवाद, मुझे नहीं पता कि मैं यह कैसे लिख सकता था कि ... यह अब तक पूरी तरह से गलत था ...
केटीफ

6

इसके दो भाग हैं: यादृच्छिककरण का परीक्षण करना और यादृच्छिकता का उपयोग करने वाली चीजों का परीक्षण करना।

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

रैंडमाइजेशन का उपयोग करने वाली चीजों का परीक्षण एक नियतात्मक पीडो-रैंडम संख्या जनरेटर के साथ सबसे अच्छा किया जाता है। चूंकि रैंडमाइजेशन के आउटपुट को बीज (उसके इनपुट्स) के आधार पर जाना जाता है, तो आप इनपुट बनाम अपेक्षित आउटपुट के आधार पर सामान्य परीक्षण कर सकते हैं। यदि आपका RNG नियतात्मक नहीं है, तो इसे एक के साथ मॉक करें जो निर्धारक है (या बस यादृच्छिक नहीं)। उस कोड से अलगाव में यादृच्छिककरण का परीक्षण करें जो इसका उपभोग करता है।


6

इसे कई बार चलने दें और अपने डेटा की कल्पना करें

यहाँ कोडिंग हॉरर से फेरबदल का एक उदाहरण है , आप देख सकते हैं कि एल्गोरिथ्म ठीक है या नहीं:

यहां छवि विवरण दर्ज करें

यह देखना आसान है कि हर संभव वस्तु को कम से कम एक बार लौटाया जाता है (सीमाएँ ठीक हैं) और वितरण ठीक है।


1
+1 विज़ुअलाइज़िंग कुंजी है। मुझे हमेशा ब्लॉक साइफर लेख के ईसीबी अनुभाग में एक पेंगुइन की तस्वीर के साथ उदाहरण पसंद आया )। एक स्वचालित सॉफ्टवेयर शायद ही कभी इस तरह की नियमितता का पता लगा सकता है
मक्सी

एह? उस दृश्य का मुद्दा यह दिखाना है कि वितरण ठीक नहीं है । भोले-भाले एल्गोरिथ्म कुछ आदेशों को दूसरों की तुलना में बहुत अधिक संभावना बनाता है। ध्यान दें कि दायीं ओर 2341, 2314, 2143 और 1342 बार कितनी अधिक हैं?
hvd

4

सामान्य संकेत मैंने कोड के साथ काम करते समय उपयोगी पाया है जो यादृच्छिक इनपुट लेता है: अपेक्षित यादृच्छिकता (अधिकतम और न्यूनतम मान, और यदि लागू हो तो अधिकतम -1 और न्यूनतम -1 मान) के किनारे मामलों की जाँच करें। स्थानों की जाँच करें (ऊपर, और नीचे) जहां संख्याओं में विभक्ति बिंदु हैं (यानी -1, 0, 1, या 1 से अधिक, 1 से कम और उन मामलों के लिए गैर-नकारात्मक जहां एक भिन्नात्मक मान फ़ंक्शन को गड़बड़ कर सकता है)। अनुमत इनपुट के बाहर कुछ स्थानों की पूरी तरह से जाँच करें। कुछ सामान्य मामलों की जाँच करें। आप एक यादृच्छिक इनपुट भी जोड़ सकते हैं, लेकिन एक इकाई परीक्षण के लिए अवांछनीय साइड इफेक्ट होता है जो कि परीक्षण के चलने पर हर बार एक ही मूल्य परीक्षण के तहत नहीं होता है (बीज दृष्टिकोण हालांकि काम कर सकता है, बीज से पहले 1,000 यादृच्छिक संख्याओं का परीक्षण करें एस या सोमेसुच)।

यादृच्छिक फ़ंक्शन के आउटपुट का परीक्षण करने के लिए, लक्ष्य की पहचान करना महत्वपूर्ण है। कार्ड के मामले में, 0-1 यादृच्छिक जनरेटर की एकरूपता का परीक्षण करने का लक्ष्य है, यह निर्धारित करने के लिए कि क्या सभी 52 कार्ड परिणाम में दिखाई देते हैं, या कुछ अन्य लक्ष्य (शायद इस सूची के सभी और अधिक)?

विशिष्ट उदाहरण में, आपको लगता है कि आपका यादृच्छिक संख्या जनरेटर अपारदर्शी है (जैसे यह इकाई syscall या malloc का परीक्षण करने के लिए कोई मतलब नहीं है - जब तक कि आप OSes नहीं लिखते)। यह यादृच्छिक संख्या जनरेटर को मापने के लिए उपयोगी हो सकता है, लेकिन आपका लक्ष्य यादृच्छिक जनरेटर लिखना नहीं है, बस यह देखने के लिए कि आपको हर बार 52 कार्ड मिलते हैं, और यह कि वे क्रम बदलते हैं।

यह कहने का एक लंबा तरीका है कि यहाँ वास्तव में दो परीक्षण कार्य हैं: यह परीक्षण करना कि RNG सही वितरण का उत्पादन कर रहा है, और जाँच रहा है कि आपका कार्ड फेरबदल कोड RNG का उपयोग यादृच्छिक परिणाम उत्पन्न करने के लिए कर रहा है। यदि आप RNG लिख रहे हैं, तो अपने वितरण को साबित करने के लिए सांख्यिकीय विश्लेषण का उपयोग करें, यदि आप कार्ड शफलर लिख रहे हैं, तो सुनिश्चित करें कि प्रत्येक आउटपुट में 52 गैर-दोहराया कार्ड हैं (यह निरीक्षण द्वारा परीक्षण के लिए बेहतर मामला है जो आप उपयोग कर रहे हैं आरएनजी)।


4

आप सुरक्षित यादृच्छिक संख्या जनरेटर पर भरोसा कर सकते हैं

मुझे बस एक भयानक विचार था: आप अपना खुद का रैंडम नंबर जनरेटर नहीं लिख रहे हैं?

यह मानते हुए कि आप नहीं हैं, तो आपको उस कोड का परीक्षण करना चाहिए जिसके लिए आप जिम्मेदार हैं , अन्य लोगों के कोड (जैसे कि SecureRandomआपके ढांचे के लिए कार्यान्वयन) के लिए नहीं।

अपने कोड का परीक्षण

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

जाहिर है आप किनारे की स्थितियों की जांच करेंगे और सुनिश्चित करेंगे कि फेरबदल ठीक उसी तरह होता है जैसे कि आपके एल्गोरिथ्म ने उचित इनपुट दिए।

सुरक्षित यादृच्छिक संख्या जनरेटर का परीक्षण

यदि आप अनिश्चित हैं कि आपकी भाषा के लिए सुरक्षित यादृच्छिक संख्या जनरेटर वास्तव में यादृच्छिक नहीं है या छोटी गाड़ी है (रेंज मान आदि से बाहर प्रदान करता है), तो आपको कई सौ मिलियन पुनरावृत्तियों पर आउटपुट का विस्तृत सांख्यिकीय विश्लेषण करने की आवश्यकता है। प्रत्येक संख्या की घटना की आवृत्ति को प्लॉट करें और इसे समान संभावना के साथ दिखाना चाहिए। यदि परिणाम एक तरह से तिरछा हो जाता है या किसी अन्य को आपको अपने निष्कर्षों की रिपोर्ट फ्रेमवर्क डिजाइनरों को देनी चाहिए। वे निश्चित रूप से समस्या को ठीक करने में दिलचस्पी लेंगे क्योंकि सुरक्षित यादृच्छिक संख्या जनरेटर कई एन्क्रिप्शन एल्गोरिदम के लिए मौलिक हैं।


1

ठीक है, आप कभी भी 100% निश्चित नहीं होंगे, इसलिए सबसे अच्छा आप यह कर सकते हैं कि यह संभावना है कि संख्या यादृच्छिक हो। प्रायिकता चुनें - कहते हैं कि संख्या या आइटम का एक नमूना त्रुटि के एक मार्जिन के भीतर एक लाख नमूने दिए गए एक्स गुना होगा। बात को एक लाख बार चलाएं, और देखें कि क्या यह मार्जिन के भीतर है। सौभाग्य से, कंप्यूटर इस तरह की चीज़ को करना आसान बनाते हैं।


लेकिन क्या इस तरह के यूनिट परीक्षणों को अच्छा व्यवहार माना जाता है ..? मैंने हमेशा सोचा है कि एक यूनिट टेस्ट जितना संभव हो उतना सरल होना चाहिए: कोई लूप, शाखाएं, या कुछ और जो बचा नहीं जा सकता है।
dlras2

4
यूनिट परीक्षण सही होना चाहिए । अगर यह ब्रांचिंग, लूप्स, रिकर्सन लेता है - यही कीमत है। आप एक-लाइनर इकाई परीक्षणों के साथ एक अत्यंत परिष्कृत, अत्यधिक-अनुकूलित कक्षाओं का परीक्षण नहीं कर सकते। मैंने एक बार एक कक्षा में यूनिट-परीक्षण के लिए दिज्क्स्ट्रा के एल्गोरिथ्म को लागू किया है।
K.Steff

3
@ K.Steff, वाह। क्या आपने दिक्क्स्ट्रा एल्गोरिथ्म को सही करने के लिए अपने यूनिट टेस्ट का परीक्षण किया था?
विंस्टन एवर्ट

अच्छी बात, तथ्य की बात के रूप में - हाँ, लेकिन इस बार 'तुच्छ' परीक्षणों के साथ। वे मूल कार्यक्रम (ए *) के लिए इकाई परीक्षण भी थे, हालांकि। मुझे लगता है कि यह वास्तव में अच्छा अभ्यास है - तेज एल्गोरिदम का परीक्षण लंगड़ा (लेकिन सही) कार्यान्वयन को फिर से शुरू करता है।
K.Steff

1

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

यह तय करने के लिए कि कौन सी संख्या अच्छी है, अपने परीक्षण को जांचने के लिए यादृच्छिकता के ज्ञात स्रोत का उपयोग करें। यादृच्छिक संख्याओं का एक अच्छा सेट दिए जाने पर परीक्षण लगभग हमेशा पास होना चाहिए। क्योंकि यहां तक ​​कि वास्तव में यादृच्छिक अनुक्रम में एक अनुक्रम उत्पन्न करने की संभावना है जो गैर-यादृच्छिक प्रतीत होती है, आप एक परीक्षा नहीं दे सकते जो पास होना निश्चित है। आप केवल उन थ्रेसहोल्ड को चुनते हैं जो यह संभावना नहीं बनाते हैं कि एक यादृच्छिक अनुक्रम एक परीक्षण विफलता का कारण होगा। यादृच्छिकता मज़ा नहीं है?

नोट: आप एक परीक्षण नहीं लिख सकते हैं जो दर्शाता है कि एक PRNG "यादृच्छिक" अनुक्रम उत्पन्न करता है। आप केवल एक परीक्षण लिख सकते हैं, अगर वह पास हो जाता है, तो कुछ संभावनाएं इंगित करता है कि PRNG द्वारा उत्पन्न अनुक्रम "यादृच्छिक" है। यादृच्छिकता की खुशी में आपका स्वागत है!


1

केस 1: एक फेरबदल का परीक्षण:

एक ऐरे पर विचार करें [0, 1, 2, 3, 4, 5], इसे फेरबदल करें, क्या गलत हो सकता है? सामान्य सामान: क) कोई फेरबदल नहीं, ख) 1-5 फेरबदल, लेकिन नहीं 0, फेरबदल 0-4 लेकिन 5 नहीं, फेरबदल, और हमेशा एक ही पैटर्न उत्पन्न, ...

उन सभी को पकड़ने के लिए एक परीक्षण:

100 बार फेरबदल करें, प्रत्येक स्लॉट में मान जोड़ें। प्रत्येक स्लॉट का योग एक दूसरे स्लॉट के समान होना चाहिए। औसत / स्टैडदेव की गणना की जा सकती है। (5 + 0) / 2=2.5, 100 * 2.5 = 25। अपेक्षित मूल्य 25 के आसपास है, उदाहरण के लिए।

यदि मान सीमा से बाहर हैं, तो एक छोटा मौका है, कि आपको एक गलत नकारात्मक मिला है। आप गणना कर सकते हैं, कि मौका कितना बड़ा है। परीक्षण दोहराएं। ठीक है - बेशक एक छोटा सा मौका है, कि एक पंक्ति में 2 बार परीक्षण विफल हो जाता है। लेकिन आपके पास एक रूटीन नहीं है जो स्वचालित रूप से आपके स्रोत को हटा देता है, अगर यूनिट-टेस्ट विफल हो जाता है, तो क्या आप? इसे फिर से चलाएं!

यह लगातार 3 बार विफल हो सकता है? हो सकता है कि आपको लॉटरी में अपना भाग्य आजमाना चाहिए।

केस 2: एक पासा को रोल करें

डाइस-रोल प्रश्न एक ही प्रश्न है। 6000 बार पासा फेंको।

for (i in 0 to 6000) 
    ++slot [Random.nextInt (6)];
return (slot.max - slot.min) < threshold;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.