2015-12-23 9 views
9

नेट संदर्भ स्रोत से पता चलता है the implementation of NextBytes() के रूप में:क्या यादृच्छिक है। अगला बाइट पक्षपातपूर्ण है?

for (int i=0; i<buffer.Length; i++) 
{ 
    buffer[i]=(byte)(InternalSample()%(Byte.MaxValue+1)); 
} 

InternalSample [0, int.MaxValue) में एक मूल्य प्रदान करता है, के रूप में यह इसका सबूत दस्तावेज़ टिप्पणी और तथ्य यह है कि Next() है, जो इस रेंज वापस जाने के लिए दस्तावेज है , बस InternalSample पर कॉल करता है।

मेरी चिंता का विषय है कि, InternalSample के बाद से int.MaxValue विभिन्न मूल्यों का उत्पादन कर सकते है, और उस नंबर को समान रूप से 256 से विभाज्य नहीं है, तो हम जिसके परिणामस्वरूप बाइट में कुछ मामूली पूर्वाग्रह, कुछ मूल्यों के साथ (इस मामले में सिर्फ 255 में) होना चाहिए होने वाली दूसरों की तुलना में कम अक्सर।

मेरा प्रश्न है:

  1. इस विश्लेषण सही है या वास्तव में विधि निष्पक्ष है?
  2. यदि पूर्वाग्रह मौजूद है, तो क्या यह किसी वास्तविक एप्लिकेशन के लिए महत्वपूर्ण है?

एफवाईआई मुझे पता है Random क्रिप्टोग्राफिक उद्देश्यों के लिए उपयोग नहीं किया जाना चाहिए; मैं इसके वैध उपयोग मामलों (ई जी। सिमुलेशन) के बारे में सोच रहा हूं।

+0

'int.MaxValue' ** +1 ** मान - क्या आप शून्य भूल गए? –

+5

हम्म, नहीं, यह एक पक्षपातपूर्ण विश्लेषण है। ऑपरेशन केवल मूल्य के कम 8 बिट लेता है। श्रेणी 0..int.maxvalue में 256 मानों का एक पूर्णांक एकाधिक है, उनमें से 8,388,608। कोई पूर्वाग्रह नहीं, डोनाल्ड ने सुनिश्चित किया। –

+1

@AndrewMorton [Random.Next() के लिए दस्तावेज़ [https://msdn.microsoft.com/en-us/library/9b3ta19y (v = vs.110) .aspx) ऐसा लगता है कि int.MaxValue कर सकता है कभी वापस नहीं किया जाएगा। इसलिए हमारे पास 'int.MaxValue' मान हैं, 'int.MaxValue + 1' मान नहीं, है ना? – ChaseMedallion

उत्तर

-3

Knuth vol का संदर्भ लें। 2, 3.2.1.1 मॉड्यूलस का विकल्प। आप वास्तव में एक मॉड्यूलस चाहते हैं जो बराबर 256 नहीं है; 256 का उपयोग करके, परिणामी बाइट के निचले 4 बिट्स 257 (पी। 12) का उपयोग करके प्राप्त किए गए अपेक्षाकृत कम यादृच्छिक हैं।

257 भी प्राइम है, जो पूर्वाग्रह को कम करने और छद्म-यादृच्छिक अनुक्रम को बढ़ाने में मदद करने के लिए सुविधाजनक है।

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

+0

जहां तक ​​"निष्पक्ष पर्याप्त" है, मेरी आशा यह होगी कि नेक्स्टबाइट्स() जैसी व्युत्पन्न विधियां किसी भी पूर्वाग्रह या गैर-समानता को उस शीर्ष के ऊपर नहीं जोड़तीं जो हम पहले से ही() से बाहर आ रहे हैं। उदाहरण के तौर पर, [जावा रैंडम विधि nextInt (बाध्य)] (https://docs.oracle.com/javase/8/docs/api/java/util/Random.html) बताती है कि परिणाम पूरी तरह से यादृच्छिक होगा कि यादृच्छिकता का आधार स्रोत पूरी तरह से यादृच्छिक है (जो यह नहीं है)। – ChaseMedallion

+0

दस्तावेज़ों का कहना नहीं है कि, यदि आप किसी स्रोत को उद्धृत करने जा रहे हैं तो उद्धरण सटीक बनाएं। "इच्छा" और "होगा" काफी अलग हैं। – zaph

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