क्या वॉन न्यूमैन की पाप में बेतरतीबी अब लागू नहीं होती?


25

कुछ अध्यायों ने कहा:

जो कोई भी नियतात्मक साधनों द्वारा यादृच्छिक संख्या उत्पन्न करने का प्रयास करता है, वह निश्चित रूप से पाप की स्थिति में रहता है।

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

यह जावा टुकड़ा एक पाश में डाल दिया:

      file.writeByte((byte) (System.nanoTime() & 0xff));

एक डेटा फ़ाइल बना सकते हैं, जिसका मैंने चित्र के रूप में प्रतिनिधित्व किया है:

nanoimage

आप संरचना देख सकते हैं, लेकिन बहुत यादृच्छिकता के साथ भी। दिलचस्पी की बात यह है कि यह पीएनजी फ़ाइल 232KB आकार की है, फिर भी इसमें 250,000 ग्रे स्केल पिक्सल हैं। पीएनजी संपीड़न स्तर अधिकतम था। यह केवल 7% का एक संपीड़न अनुपात है, अर्थात। काफी गैर संकुचित। यह भी दिलचस्प है कि फ़ाइल अद्वितीय है। इस फ़ाइल की प्रत्येक पीढ़ी थोड़ा अलग पैटर्न है और इसकी ~ 7% संपीड़ितता समान है। मैं इस पर प्रकाश डालता हूं क्योंकि यह मेरे तर्क के लिए महत्वपूर्ण है। यह ~ 7बिट्स / बाइट एन्ट्रापी है। यह एक मजबूत संपीड़न एल्गोरिथ्म के उपयोग पर निश्चित रूप से कम हो जाएगा। लेकिन 0 बिट्स / बाइट के पास कुछ भी कम न करें। एक बेहतर छाप उपरोक्त छवि को ले कर और यादृच्छिक रूप से इसके रंगीन मानचित्र को प्रतिस्थापित करने से हो सकती है: -

यादृच्छिक nanoimage

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

पूरक

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

संक्षिप्त फ़ाइल ~ 66% तक संपीड़ित होती है, जो ~ 5.3 बिट्स / बाइट या 10.5Mbit / छवि की एक एंट्रोपी दर की ओर ले जाती है। एक आश्चर्यजनक मात्रा में एन्ट्रापी

पूरक २

नकारात्मक टिप्पणियां आई हैं कि संपीड़न परीक्षण पद्धति से मेरी एन्ट्रापी त्रुटिपूर्ण है, केवल एक ढीले ऊपरी बाध्य अनुमान देता है। इसलिए मैं अब एनआईएएसटी की आधिकारिक क्रिप्टोग्राफिक एन्ट्रापी मूल्यांकन परीक्षण, SP800-90B_EntropyAssessment हालांकि समवर्ती फ़ाइल चला रहा हूं । यह उतना ही अच्छा है जितना कि गैर-आईआईडी एन्ट्रापी माप के लिए मिलता है। यह रिपोर्ट है (खेद है कि यह प्रश्न लंबा हो रहा है, लेकिन मुद्दा जटिल है): -

Running non-IID tests...

Entropic statistic estimates:
Most Common Value Estimate = 7.88411
Collision Test Estimate = 6.44961
Markov Test Estimate = 5.61735
Compression Test Estimate = 6.65691
t-Tuple Test Estimate = 7.40114
Longest Reapeated Substring Test Estimate = 8.00305

Predictor estimates:
Multi Most Common in Window (MultiMCW) Test: 100% complete
    Correct: 3816
    P_avg (global): 0.00397508
    P_run (local): 0.00216675
Multi Most Common in Window (Multi MCW) Test = 7.9748
Lag 

Test: 100% complete
    Correct: 3974
    P_avg (global): 0.00413607
    P_run (local): 0.00216675
Lag Prediction Test = 7.91752
MultiMMC Test: 100% complete
    Correct: 3913
    P_avg (global): 0.00407383
    P_run (local): 0.00216675
Multi Markov Model with Counting (MultiMMC) Prediction Test = 7.9394
LZ78Y Test: 99% complete
    Correct: 3866
    P_avg (global): 0.00402593
    P_run (local): 0.00216675
LZ78Y Prediction Test = 7.95646
Min Entropy: 5.61735

परिणाम यह है कि एनआईएसटी का मानना ​​है कि मैंने एन्ट्रापी के 5.6 बिट्स / बाइट उत्पन्न किए हैं। मेरा DIY संपीड़न अनुमान 5.3 बिट्स / बाइट पर लगाता है, थोड़ा अधिक रूढ़िवादी।

-> सबूत इस धारणा का समर्थन करते हैं कि एक कंप्यूटर जो केवल सॉफ्टवेयर चला रहा है, वास्तविक एंट्रॉपी उत्पन्न कर सकता है। और वह वॉन न्यूमैन गलत था (लेकिन शायद अपने समय के लिए सही था)।


मैं निम्नलिखित संदर्भ प्रस्तुत करता हूं जो मेरे दावे का समर्थन कर सकते हैं: -

क्या कार्यक्रम निष्पादन की दर में गैर-नियतात्मकता के कोई स्टोकेस्टिक मॉडल हैं?

संभावित वास्तविक समय प्रणालियों के WCET विश्लेषण

क्या कोई सॉफ्टवेयर एल्गोरिदम है जो एक गैर-नियतात्मक अराजकता पैटर्न उत्पन्न कर सकता है? और अराजक प्रभावों की प्रासंगिकता।

क्वांटम एन्ट्रापिक अनिश्चितता सिद्धांत के साथ समानताएं

अलेक्सी शिपिलव के ब्लॉग में नैनो टाइम () के अराजक व्यवहार के बारे में बताया गया है। उसका बिखराव कथानक मेरे प्रति असहमति नहीं है।


47
मुझे लगता है कि आप गलत कर रहे हैं "मैं एक पैटर्न नहीं देख सकता" / गणितीय / स्टोकेस्टिक यादृच्छिकता के साथ हर दिन यादृच्छिकता।
राफेल

3
@ राफेल मैं नहीं। गणितीय संपीड़न एल्गोरिदम करते हैं। और क्या वास्तविक समय ऑपरेटिंग सिस्टम की बात है अगर सभी सॉफ्टवेयर हमेशा नियतात्मक हैं? मैं बिट्स के संदर्भ में केवल इन-निर्धारण के बारे में पूछ रहा हूं।
पॉल उस्ज़ाक

16
आप "कंप्यूटर पर" और "नियतात्मक साधनों के साथ" संगम कर रहे हैं।
user253751

24
आपकी मूलभूत समस्या यह है कि आप "मैं यह नहीं समझता कि यह पैटर्न कैसे उत्पन्न होता है" से शुरू होता है और यह निष्कर्ष निकालता है कि "कोई भी यह नहीं समझ सकता है कि यह पैटर्न कैसे उत्पन्न होता है"। यह सही नहीं है और अपने एसई प्रोफाइल को देखते हुए आप निश्चित रूप से क्रिप्टोग्राफी से परिचित हैं, यह जानने के लिए कि यह पालन नहीं करता है। जिस सिस्टम को आप नहीं तोड़ सकते, उसे तैयार करना आसान है, लेकिन असली चुनौती एक ऐसे सिस्टम को तैयार करना है जिसे दूसरे लोग भी नहीं तोड़ सकते।
गिल्स एसओ- बुराई को रोकना '

4
मुझे लगता है कि "नियतात्मक" की अधिकांश परिभाषाएँ कॉल करने वाले एल्गोरिदम को बाहर कर देंगी System.nanoTime()
bmm6o

जवाबों:


75

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

इस तरह प्राप्त यादृच्छिकता की गुणवत्ता में कुछ विश्वास प्राप्त करने के लिए शुरू करने के लिए एक अधिक विस्तृत विश्लेषण और परीक्षा होती है।

यह सोचने के कारण हैं कि हम घड़ी घबराहट और दो हार्डवेयर घड़ियों के बीच बहाव का उपयोग करके यादृच्छिकता की कुछ मात्रा प्राप्त कर सकते हैं , लेकिन यह नाजुक और मुश्किल है, इसलिए आपको सावधान रहना होगा। मैं आपके स्वयं के कार्यान्वयन की कोशिश नहीं करूंगा। इसके बजाय, मेरा सुझाव है कि आप एंट्रोपी के उच्च-गुणवत्ता वाले स्रोत (आमतौर पर अधिकांश आधुनिक ऑपरेटिंग सिस्टमों में लागू) का उपयोग करेंगे। अधिक जानकारी के लिए, विकिपीडिया , हैज और /crypto//q/48302/351 (जो ऐसा लगता है कि आप पहले से ही जानते हैं) देखें।

अंत में, आपके सलामी बल्लेबाज पर एक टिप्पणी:

"जो कोई भी नियतात्मक साधनों द्वारा यादृच्छिक संख्या उत्पन्न करने का प्रयास करता है, वह निश्चित रूप से पाप की स्थिति में रहता है।"

इसका मतलब हमेशा यह माना जाता है कि आप केवल कंप्यूटर के साथ सही यादृच्छिक संख्या उत्पन्न नहीं कर सकते।

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


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

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

3
@ जूल्स: क्या मायने नहीं रखता कि पीएनजी सादगीपूर्ण है, बल्कि यह कि यह उन प्रकार के पैटर्न को संपीड़ित करने के लिए डिज़ाइन किया गया है जो कई प्रकार के चित्रों में दिखाई देने की संभावना होगी। यदि कोई एक विशिष्ट चित्र लेना चाहता है, जैसे कि 123x234 पिक्सेल और उसी क्रम में पिक्सेल रखते हुए इसे 234x123 में बदल दें (इसलिए नई तस्वीर की पहली पंक्ति में पुरानी और शीर्ष 111 पिक्सेल की शीर्ष पंक्ति से 123 पिक्सेल शामिल हैं। दूसरी पंक्ति, नई तस्वीर की अगली पंक्ति में मूल दूसरी पंक्ति के अंतिम 12 पिक्सेल, मूल तीसरी पंक्ति के सभी, और चौथी के 99 आदि थे, पीएनजी होगा ...
5

1
... संभवत: परिणामी तस्वीर को लगभग मूल के रूप में संकुचित न करें क्योंकि पंक्तियों के बीच अब वैसा ही स्थानिक संबंध नहीं होगा, इस तथ्य के बावजूद कि दूसरी तस्वीर में ठीक उसी क्रम में समान पिक्सेल, बिल्कुल उसी क्रम में शामिल होंगे; प्रथम।
सुपरकैट

100

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


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
DW

20

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

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

यह सच है कि एक साझा कंप्यूटर पर एक जटिल श्रृंखला के साथ चल रहा है जो कैश की एक जटिल श्रृंखला है और जो विभिन्न नेटवर्क और हार्डवेयर इनपुट प्राप्त करता है, सरल, पृथक, समर्पित हार्डवेयर पर चलने की तुलना में बहुत अधिक एन्ट्रापी तक पहुंचता है। लेकिन अगर यह प्रक्रिया उस एन्ट्रापी तक पहुँच जाती है तो यह अब नियतात्मक नहीं है और इसलिए बोली लागू नहीं होती है।


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

1
@PaulUszak मुझे ऐसा कितनी बार कहना है? वॉन न्यूमैन का कहना है कि आप नियत रूप से यादृच्छिक संख्या उत्पन्न नहीं कर सकते हैं। आप यह कहते रहते हैं कि वॉन न्यूमैन गलत है क्योंकि आप नोंडेटर्मिनिज़्म का उपयोग कर सकते हैं। ऐसा लगता है कि आप बार-बार यह दावा कर रहे हैं कि बयान "पेरिस से बर्लिन तक चलने में बहुत लंबा समय लेता है" आधुनिक दुनिया में लागू नहीं होता है क्योंकि आप उन दो शहरों के बीच उड़ान भर सकते हैं। तो क्या? उद्धरण चलने के बारे में है और इसमें अभी भी लंबा समय लगता है। वॉन न्यूमैन का उद्धरण नियतात्मक प्रणालियों के बारे में है, और वे अभी भी बेतरतीब ढंग से काम नहीं कर सकते हैं।
डेविड रिचरबी

1
@PaulUszak यह सचमुच असंभव है। यदि आपको लगता है कि आपके पास एक नियतात्मक एल्गोरिथ्म है जिसका व्यवहार उसके इनपुट द्वारा निर्धारित नहीं किया गया है, तो यह केवल पहचानने की बात है कि एन्ट्रापी कहाँ प्रस्तुत की गई है।
bmm6o

18

जो कोई भी नियतात्मक साधनों द्वारा यादृच्छिक संख्या उत्पन्न करने का प्रयास करता है, वह निश्चित रूप से पाप की स्थिति में रहता है।

जब आप "पाप की स्थिति में रहना" की व्याख्या "एक बकवास कर रहे हैं" के रूप में करते हैं, तो यह पूरी तरह से सही है।

आपने जो कुछ किया है वह धीमी गति से विधि System.nanoTime()का उपयोग कर रहा है बल्कि कमजोर यादृच्छिकता उत्पन्न करता है। आपने कुछ मापा

... एन्ट्रापी दर ~ 5.3 बिट्स / बाइट ...

लेकिन यह सिर्फ ऊपरी सीमा है। आप कभी भी एक ऊपरी सीमा प्राप्त कर सकते हैं। वास्तविक एन्ट्रापी छोटे परिमाण के आदेश हो सकते हैं।

एमडी 5 जैसे क्रिप्टोग्राफिक हैश का उपयोग करके सरणी को भरने के बजाय प्रयास करें। एक अनुक्रम की तरह md5(0), md5(1), ...(प्रत्येक मान एक या अधिक बाइट्स से लिया, यह कोई फर्क नहीं पड़ता)। आपको बिल्कुल भी कोई संपीड़न नहीं मिलेगा (हाँ, एमडी 5 टूट गया है, लेकिन अभी भी अचूक डेटा का उत्पादन करने के लिए पर्याप्त है)।

हम कह सकते हैं, कि इसमें कोई एंट्रॉपी नहीं है, फिर भी आप 8 बिट्स / बाइट को मापेंगे।

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

जब आपको क्रिप्टोग्राफी के लिए यादृच्छिकता की आवश्यकता होती है, तो आपको वास्तव में अपने ओएस, आपकी भाषा या एक अच्छी लाइब्रेरी द्वारा प्रदान की गई चीज़ का सहारा लेना होगा। ऐसे प्रदाता कई स्रोतों और / या समर्पित HW से एन्ट्रापी एकत्र करते हैं और काफी काम ऐसे एन्ट्रापी अनुमानों में डाल दिया गया है।

ध्यान दें कि आपको आमतौर पर किसी भी एंट्रोपी की आवश्यकता होती है। एक अच्छा (निर्धारक) PRNG कुछ यादृच्छिक बाइट्स के साथ आरंभ किया गया है, क्रिप्टोग्राफी के लिए प्रयोग करने योग्य है, और इसलिए बाकी सब के लिए भी।


4
@PaulUszak ज़रूर, एक निर्धारित PRNG OTP के रूप में इस्तेमाल नहीं किया जा सकता है। लेकिन OTP एक बहुत ही खास मामला है क्योंकि परिभाषा के अनुसार इसे वास्तव में यादृच्छिक कुंजी की आवश्यकता होती है। AFAIK कुछ और के लिए, एक बेतरतीब ढंग से सुरक्षित सुरक्षित PRNG (बीज आवश्यक सुरक्षा स्तर पर निर्भर करता है, जैसे 128, या 256 बिट्स एन्ट्रापी होना चाहिए)।
मारार्टिनस

3
"जब आपको वास्तव में कुछ यादृच्छिक की आवश्यकता होती है" → आपको मूल रूप से कभी भी सच्चे यादृच्छिकता की आवश्यकता नहीं होती है। बल्कि, आपको सहसंबंध की कमी की आवश्यकता होती है। सच्ची यादृच्छिकता एक मजबूत गारंटी है, लेकिन मूल रूप से हर मामला एक आधुनिक CSPRNG और एक अप्रत्याशित बीज से ही संतुष्ट है।
विड्रैक

3
@maaartinus तुम मुझे बहुत नहीं मिल रहे हैं। मैं कह रहा हूं कि आपको सच्चे यादृच्छिक बीजों की आवश्यकता नहीं है, आपको सिर्फ अप्रत्याशित असंबद्ध बीजों की आवश्यकता है।
विड्राक

6
एक उदाहरण के रूप में, मैंने 1 मिलियन अनुक्रमिक संख्याओं के साथ एक पाठ फ़ाइल बनाई। gzipकेवल 63% संपीड़न प्राप्त करने में सक्षम था, भले ही लगभग कोई एन्ट्रॉपी न हो। यह केवल दोहराव का पता लगा सकता है जैसे999919999299993...
बरम

6
@PaulUszak यह मेरी बात थी - संपीड़न अनुपात एन्ट्रापी का एक अच्छा संकेतक नहीं है, यह इंगित करता है कि क्या विशेष संपीड़न एल्गोरिदम आपके डेटा में किस तरह के पैटर्न का पता लगाने में सक्षम है।
बरमार

14

मुझे लगा कि मैं "यादृच्छिक" के अर्थ पर झंकार करूँगा। यहाँ अधिकांश उत्तर निर्धारक प्रक्रियाओं के उत्पादन की तुलना में यादृच्छिक प्रक्रियाओं के उत्पादन के बारे में बात कर रहे हैं । यह "यादृच्छिक" का एक अच्छा अर्थ है, लेकिन यह एकमात्र नहीं है।

यादृच्छिक प्रक्रियाओं के आउटपुट के साथ एक समस्या यह है कि वे नियतात्मक प्रक्रियाओं के आउटपुट से अलग करना मुश्किल है: उनके पास कोई रिकॉर्ड नहीं है कि उनका स्रोत कितना यादृच्छिक था। इसका एक चरम उदाहरण एक प्रसिद्ध XKCD कॉमिक है जहां एक यादृच्छिक संख्या जनरेटर हमेशा लौटता है 4, एक कोड टिप्पणी के साथ दावा करता है कि यह यादृच्छिक है क्योंकि यह एक डाई रोल से आया है।

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

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

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

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

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

क्यों नहीं? आइए कल्पना करें कि हम एक छोटा कंप्यूटर प्रोग्राम लिखते हैं और हम इसका उपयोग यादृच्छिक संख्याओं के अनुक्रम को उत्पन्न करने के लिए करते हैं। निम्नलिखित स्थितियों में से एक को लागू करना चाहिए:

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

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

  • व्यवस्थित रूप से किसी तरह से कोड को "ब्लोट" करें। हालांकि, कोलमोगोरोव जटिलता उस विशेष कार्यक्रम के बारे में परवाह नहीं करती है जो हम डेटा उत्पन्न करने के लिए करते थे: यह केवल जो भी प्रोग्राम उत्पन्न करता है वह सबसे छोटा है। व्यवस्थित ब्लोट कोलमोगोरोव जटिलता को नहीं जोड़ता है, क्योंकि कोड में ऐसे पैटर्न स्वयं बहुत कम मात्रा में कोड के साथ उत्पन्न हो सकते हैं। उदाहरण के लिए यदि हम run(shortGenerator)प्राप्त करने के लिए व्यवस्थित ब्लोट का एक पूरा भार लेते हैं और जोड़ते हैं run(bloatedGenerator), तो एक छोटा जनरेटर अभी भी मौजूद है run(addBloat(shortGenerator))
  • ब्लोट को गैर-व्यवस्थित रूप से जोड़ें , अर्थात बिना किसी पैटर्न के, ताकि एक addBloatफ़ंक्शन को केवल कोड के रूप में फूला हुआ होने का अंत करना पड़े। हालांकि, पैटर्न से इतना रहित होना वास्तव में कुछ यादृच्छिक (उच्च कोलमोगोरोव जटिलता) बनाता है। इसलिए इस तरह से पैदा कार्यक्रम सूजन है उत्पादन की अनियमितता (Kolmogorov जटिलता) में वृद्धि, लेकिन यह भी अनियमितता (Kolmogorov जटिलता) की मात्रा हम स्रोत कोड के रूप में प्रदान करने के लिए है कि बढ़ जाती है। इसलिए यह अभी भी है जो "यादृच्छिकता" प्रदान कर रहे हैं और कार्यक्रम नहीं। सिर्फ लिखने के उपरोक्त उदाहरण में print([...]), गैर-व्यवस्थित ब्लोट को जोड़ना केवल उस हार्ड-कोडित सूची में अधिक "यादृच्छिक" संख्या लिखने के बराबर है।

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

@PaulUszak Kolmogorov जटिलता आपके द्वारा पोस्ट की गई पहली छवि की तरह, एक विशेष मूल्य की "यादृच्छिकता" को मापती है ; या आपके द्वारा पोस्ट की गई दूसरी छवि; या इस HTML पृष्ठ का एक स्नैपशॉट; आदि। यदि आप उस प्रक्रिया के बारे में परवाह करते हैं जिसने एक छवि (नियतात्मक या नहीं) उत्पन्न की है, तो शैनन जानकारी जैसे अन्य उपाय अधिक उपयुक्त होंगे; मैंने अभी देखा कि कोई अन्य उत्तर ने कोलमोगोरोव जटिलता का उल्लेख नहीं किया। वे दोनों उपयोगी तरीके हैं, क्योंकि वे हमें अलग-अलग बातें बताते हैं।
वारबो

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

6
@PaulUszak आपकी टिप्पणी के आधार पर ऐसा लगता है कि आप पहले से ही बोली को साबित करने के लिए आवश्यक हर चीज का एहसास करते हैं: आपने पैटर्न बनाने के लिए नियतात्मक साधनों का उपयोग नहीं किया , क्योंकि आप एंट्रॉपी पर भरोसा कर रहे हैं कि आप या बाहरी दुनिया (नेटवर्क हार्डवेयर और सर्वर) आप स्ट्रीम से सामग्री स्ट्रीम कर रहे हैं, आदि) ने आपके सिस्टम में पेश किया है। एक लूप में लिए गए नैनोसेकंड में समय माप के अंतिम आठ बिट्स की जांच करना या न करना, फसल काटने का एक अच्छा तरीका है कि एन्ट्रापी एक अलग सवाल है, जिस पर बहुत सारे जवाब मिल रहे हैं, लेकिन यह एक अलग विषय है।
मृत्युंजय

7

संपीड़न यादृच्छिकता का सटीक परीक्षण नहीं है, और न ही एक छवि को देख रहा है और कह रहा है कि "यादृच्छिक दिखता है"।

यादृच्छिकता को अनुभवजन्य विधियों द्वारा परीक्षण किया जाता है । यादृच्छिकता के परीक्षण के लिए विशेष रूप से डिज़ाइन किए गए सॉफ़्टवेयर / एल्गोरिदम के उदाहरण हैं, उदाहरण के लिए TestU01 और Diehard परीक्षण

इसके अलावा, आपकी छवि वास्तव में एक अंतरिक्ष पर मैप की गई संख्या का 1D स्ट्रिंग है, और इस प्रकार कुछ पैटर्न का अच्छा प्रतिनिधित्व नहीं है जो दिखाई दे सकते हैं।

यदि आप पिक्सेल द्वारा अपनी छवि पिक्सेल की जांच करने के लिए थे, तो आपको अचानक गिरावट से पहले मूल्य बढ़ने के कई छोटे पैटर्न मिलेंगे। यदि आप x मान के साथ एक नमूना बनाने के लिए थे नमूना संख्या और y मान 'यादृच्छिक' फ़ंक्शन से प्राप्त होने वाला मान, तो आप सबसे अधिक संभावना यह पाएंगे कि आपका डेटा वास्तव में एक आरा लहर की तरह दिखता है:

सववथ वेव

यह उन मानों द्वारा बनाया गया पैटर्न है जो मॉड्यूलर अंकगणित के तहत बढ़ता है (जो कि आपकी गणना का उदाहरण है: एक स्थिर दर पर बढ़ते समय, और & 0xFFअभिनय के रूप में mod 256)।


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

2
@PaUUszak क्या वह मापक समझ में आता है अगर यह संपीड़न एल्गोरिथ्म पर निर्भर करता है?
कुत्स्कम

@kutschkem WEIST यह NIST SP 800-90B में मानक एंट्रोपी उपायों में से एक है। यह करना भी आसान है। आप गैर IID एन्ट्रापी को कैसे माप सकते हैं? और कम्प्रेशन अल्गोस एक निम्न सीमा तक स्पर्शोन्मुख हैं, इसलिए 2 से विभाजन। शैनन सूत्र यहां काम नहीं करता है।
पॉल उस्ज़ाक

3
@PaUUszak - क्रिप्टोग्राफ़िक प्रयोजनों के लिए, हमें यह मान लेना चाहिए कि एक हमलावर द्वारा पीढ़ी की विधि ज्ञात है। उस विधि को जानना जिसके द्वारा यह डेटा लगभग उत्पन्न किया गया था, निश्चित रूप से इसके लिए एक संपीड़न एल्गोरिदम लिखने की अनुमति देता है जो PNG से बेहतर करता है या NIST परीक्षण जो भी दृष्टिकोण करता है, दोनों जो कुछ भी नहीं मानते हैं (या, PNG के मामले में, वास्तव में सही नहीं है) डेटा के स्रोत के बारे में।
जूल्स

5

आप "संख्या से यादृच्छिक संख्याओं की अवधारणा को भ्रमित कर रहे हैं जो यादृच्छिक प्रतीत होते हैं।"

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

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

अब, आपका उदाहरण, जैसा कि कई ने बताया है, नियतात्मक नहीं है। कार्यक्रम निर्दिष्ट नहीं करता है कि किस मूल्य से बाहर आता है System.nanoTime()। इस प्रकार यह छद्म यादृच्छिक संख्याओं को उत्पन्न करने के लिए CSPRNG का उपयोग करने के समान वर्ग में नहीं है। पूर्व निर्विवाद हो सकता है जबकि उत्तर निर्धारक है यदि कुंजी का मूल्य निर्धारक है। पूर्व में ऐसे ऑपरेशन होते हैं जो नियतात्मक मूल्यों के लिए परिभाषित नहीं होते हैं।

हालांकि, आप ध्यान देंगे कि मैंने कहा था कि यह नोंडेटेर्मिनिस्टिक हो सकता है। System.nanoTime()इस उद्देश्य के लिए मूल्य प्रदान करने के लिए डिज़ाइन नहीं किया गया है कि अवगत रहें। यह पर्याप्त रूप से nondeterministic हो सकता है या नहीं। कोई एप्लिकेशन सिस्टम घड़ी को ऐसे समायोजित कर सकता है कि System.nanoTime()सभी कॉल 256 नैनोसेकंड (या बंद) के गुणकों पर होती हैं। या आप जावास्क्रिप्ट में काम कर रहे हो सकते हैं, जहां स्पेक्टर के हालिया कारनामों में प्रमुख ब्राउज़रों के लिए जानबूझकर उनके टाइमर के संकल्प को कम करना है। इन मामलों में, आपके "रैंडम नंबर" उन वातावरणों में अत्यधिक अनुमानित हो सकते हैं, जिनकी आपने योजना नहीं बनाई थी।

  • इसलिए निर्धारक प्रक्रियाओं के साथ यादृच्छिक संख्या उत्पन्न करना ... पाप।
  • समर्पित यादृच्छिक हार्डवेयर के साथ यादृच्छिक संख्या उत्पन्न करना ... पाप नहीं।
  • कंप्यूटर के nondeterministic पहलुओं के साथ यादृच्छिक संख्या उत्पन्न करना ... शायद पाप।

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


4

मुझे नहीं लगता कि आपने दावे को समझा है। मुद्दा यह है कि यदि 'यादृच्छिक' संख्या श्रृंखला (या कुछ भी, वास्तव में) उत्पन्न करने के लिए एक निर्धारक प्रक्रिया है, तो पैटर्न को खोजना इस प्रक्रिया को खोजने का काम है!

इसलिए, अगले पूर्णांक की भविष्यवाणी करने के लिए हमेशा एक निर्धारक विधि मौजूद होती है। यदि हम यादृच्छिकता मान लेते हैं तो यह ठीक है कि हम क्या होने की उम्मीद नहीं करते हैं!

किसी भी पर्याप्त रूप से जटिल निर्धारकता स्टोचैस्टिसिटी से अप्रभेद्य है।

- Wrzlprmft के उपयोगकर्ता पृष्ठ से

इसलिए, यहां तक ​​कि अगर कुछ यादृच्छिक दिखता है, तो पृथ्वी पर हम इसे 'यादृच्छिक' के रूप में क्यों मॉडल करेंगे यदि हमारे पास इसे उत्पन्न करने के लिए एक निर्धारक प्रक्रिया है?

यह, मुझे लगता है, प्रमुख समस्या है। आप केवल किसी न किसी रूप से पता चला है indistinguishability PRNG की और 'सच अनियमितता'।

हालाँकि, ये अवधारणाएँ समान हैं इसलिए इसका पालन नहीं किया जाता है। विशेष रूप से, यादृच्छिकता एक गणितीय, सैद्धांतिक अवधारणा है। हमने पहले ही ऊपर दिखाया है, कि सिद्धांत में, PRNG को 'सच्ची यादृच्छिकता' के रूप में मानने से विरोधाभास होता है। इसलिए, वे समान नहीं हो सकते।


1
अरे, क्या आपको यकीन है कि आप उस बोली को समझ गए हैं? आप खुद ही इसका खंडन करते दिख रहे हैं ..?
पॉल उस्ज़ाक

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

2
@PaulUszak आप दावा करते हैं कि क्योंकि कुछ आपको रूखा लगता है, यह यादृच्छिक है। लेकिन वास्तव में, सिर्फ इसलिए कि कुछ स्टोकेस्टिक दिखता है इसका मतलब यह नहीं है कि यह यादृच्छिक है - यह सिर्फ एक पर्याप्त जटिल निर्धारण प्रक्रिया हो सकती है।
गिल्स एसओ- बुराई को रोकें '

O(n2)

3

मुझे लगता है कि अन्य लोगों ने इसे पहले ही इंगित कर दिया था, लेकिन ऐसा नहीं था कि इस पर जोर दिया जाए, इसलिए मुझे चर्चा में भी शामिल होने दें।

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

इसके अलावा, आप "कंप्यूटर पर" और "नियतात्मक" वाक्यांशों के कुछ गलत अर्थ हैं। आप निश्चित रूप से से कंप्यूटर पर nondeterministic ऑपरेशन कर सकते हैं

इसके अलावा, वास्तव में, आपने ऐसा किया था , लेकिन यह पहली नज़र में स्पष्ट नहीं है।

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

अब अपने एल्गोरिथ्म को देखें। यह किस पर आधारित है? आपके पास कितना राज्य है? क्या यह नियतात्मक है?

  file.writeByte((byte) (System.nanoTime() & 0xff));

आइए नजरअंदाज करें file.write और फ्लशिंग बफ़र्स के किसी भी मुद्दे, I / O की प्रतीक्षा कर रहे हैं (क्या आपने हार्डड्राइव केबलों पर एक पल के लिए भारी शोर जोड़ने की कोशिश की थी? नहीं; अरे आप यह कर सकते थे। अरे, यह तो nondeterministic है :)!), और चलो स्रोत पर ध्यान केंद्रित करते हैं, यह अधिक महत्वपूर्ण है।

समय एक राज्य के कुछ प्रकार है। यह भिन्न होता है, लेकिन इसमें से अधिकांश समान है। इसलिए आपने इसे दरकिनार करने की कोशिश की और ड्रॉप करने के लिए & 0xFF लिया की और राज्य का अधिकांश हिस्सा । लेकिन आपने यह सब नहीं छोड़ा है, पिछले पढ़ने की कुछ स्थिति अगले एक पर लीक हो सकती है, इसलिए यह निश्चित रूप से पूरी तरह से नहीं है *)

लेकिन हमें इसमें कोई दिलचस्पी नहीं है। यह साबित करने के लिए कि उद्धरण गलत है:

जो कोई भी नियतात्मक साधनों द्वारा यादृच्छिक संख्या उत्पन्न करने का प्रयास करता है, वह निश्चित रूप से पाप की स्थिति में रहता है।

आपको इसे एक नियतात्मक माध्यम से साबित करने की आवश्यकता है।
हम जिस चीज में रुचि रखते हैं, वह है: क्या आपका अहंकार निश्चित रूप से पूरी तरह से निर्धारक है ?

..और यह स्पष्ट है कि यह नहीं है।

  System.nanoTime() & 0xff

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

मैं पूरी तरह सहमत हूँ कि मैं यहाँ अतिशयोक्ति कर रहा हूँ। बहुत अधिक प्रभाव बनाने के लिए ड्रिफ्ट्स बड़े नहीं होंगे (हालांकि एक असली के लिए nanotimeवे हो सकते हैं)। अधिक महत्वपूर्ण बात,nanotime उपवास करना है। यह वास्तविक समय स्रोत से नहीं पढ़ता है। यह प्रोसेसर के आंतरिक निर्देश / चक्र गणना पर आधारित है। यह वास्तव में नियतात्मक है, यदि आप कोई संदर्भ स्विच सुनिश्चित करते हैं।

मेरा कहना है कि, वास्तव में 100% नियतात्मक एल्गोरिथ्म को चलाना बहुत कठिन हो सकता है यदि आप इसे समय पर आधार बनाते हैं, और जब तक आपके पास पूरी तरह से निर्धारक साधन न हों, तब तक आपको उस बोली को अस्वीकार करने का कोई अधिकार नहीं है।

*) दिलचस्प है, अगर आप कट्टर तरीके से चलते हैं, तो आप शायद वास्तविक यादृच्छिकता बढ़ा सकते हैं। प्रत्येक बिट पढ़ने से पहले & 0x01, बिट द्वारा बिट, और थ्रेड-वेट करने योग्य समय का ध्यान रखें। इस तरह से डेटा उत्पन्न करना लंबे समय तक हास्यास्पद होगा, लेकिन मैं वास्तव में यह तर्क दूंगा कि इसे लगभग वास्तव में यादृच्छिक माना जा सकता है, IIF आप गैर-आरटीओएस पर चल रहे हैं और प्रत्येक 'ध्यान देने योग्य समय' में IFF भी इस अंतर्निहित को सुनिश्चित करने के लिए पर्याप्त है ओएस या तो सो गया, या संदर्भ-कार्य किसी अन्य कार्य में बदल गया।


2
NAS

ऐसा ही कुछ मेरे पीछे था "[आप] बहुत बेहतर निर्माण कर सकता था [संपीड़न] एल्गोरिथ्म"
quetzalcoatl

सटीक 5.3 मान पर ठीक न करें। चाहे आप कितना भी बेहतर कम्फ़र्टेंस ऐल्गो कर सकें (आप जैसा कि मैं दुनिया में सर्वश्रेष्ठ में से किसी एक का उपयोग नहीं कर सकता - paq8px) कर सकता हूं, जो अयोग्य है वह शुद्ध एंट्रॉपी है। यह यादृच्छिकता की सिद्धांत परिभाषाओं में से एक है। या आप यह सुझाव दे रहे हैं कि शून्य बाइट्स को कुछ भी संकुचित किया जा सकता है? कबूतर के प्रशंसक असहमत होंगे।
पॉल उस्ज़ाक

0xff वहाँ है क्योंकि आप 64 बिट पूर्णांक का उपयोग करके एक अच्छा चित्र नहीं बना सकते हैं। और यदि आप 0x01 का उपयोग करते हैं, तो आपको बिट हैंडलिंग के साथ गड़बड़ करना होगा जिसे मैं परेशान नहीं कर सकता। बस इतना ही। NIST एन्ट्रापी और मेरे खुद के उपाय वैसे भी उच्च बिट्स में एन्ट्रापी का सुझाव देते हैं (उनमें से ~ 5)।
पॉल उस्ज़ाक

1
+1, और यह मुझे अब तक का सबसे अच्छा उत्तर लगता है: स्थिति के बारे में पूछे जाने वाली स्थिति में एन्ट्रापी का एकमात्र स्रोत ठीक यही असंगतता है कि घड़ी के प्रत्येक रीड के बीच कितना समय गुजरता है ! और यह विवरणों के मिश्रण से आता है जैसे कि ऑपरेटिंग सिस्टम शेड्यूलर कैसे काम करता है और हार्डवेयर कैसे काम करता है और विवरण जैसे कि उपयोगकर्ता ने उस समय तक उस सिस्टम को क्या किया है, जो अप्रत्यक्ष रूप से उन चीजों को प्रभावित करता है जैसे कि शेड्यूलिंग या कितनी लंबी डिस्क की आवश्यकता होती है समय के साथ विखंडन के कारण पहुंचें या स्वैप / मेमोरी / कैश में क्या था या क्या नेटवर्क / आदि गतिविधि चल रही थी।
मृत्युंजय

2

मुझे लगता है कि आपको जिस उत्तर की आवश्यकता है वह इस टिप्पणी से शुरू होता है जो आपने स्वयं दूसरे उत्तर में की थी:

पैटर्न जावा, जेवीएम, ओएस, सीपीयू + कैश, हार्ड डिस्क, ट्रान्स संगीत मैं स्ट्रीम कर रहा था का एक परिणाम है जो सीपीयू / रैम चक्र और बीच में सब कुछ खपत करता है। पैटर्न बस एक / अगले लूप के अंदर जावा कोड की एक पंक्ति से उत्पन्न होता है। एन्ट्रॉपी का एक महत्वपूर्ण हिस्सा अंतर्निहित हार्डवेयर सर्किट से आता है।

आप पहले से ही यह महसूस करते हैं, मुझे लगता है: पैटर्न बनाने के लिए आपने नियतात्मक साधनों का उपयोग नहीं किया ।

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

यह, वैसे, आधुनिक ऑपरेटिंग सिस्टम अपने यादृच्छिक संख्या जेनरेटरों को बीजित करने का एक बड़ा हिस्सा है जो कार्यक्रमों के लिए उपलब्ध हैं: इसके हार्डवेयर और उपयोगकर्ता के साथ बातचीत में एन्ट्रापी का उपयोग करके, जो हमें उम्मीद है कि एक हमलावर के लिए अनुमानित नहीं है।

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

मुझे लगता है कि ज्यादातर उत्तर इस बात पर केंद्रित हो रहे हैं कि क्या लूप में लिए गए नैनोस्कॉन्ड्स में अंतिम आठ बिट्स की समय-समय पर जाँच करना एक अच्छा तरीका है कि एंट्रोपी की कटाई की जाए। व्यवहार में एक यादृच्छिक संख्या पीढ़ी योजना के रूप में अपने उदाहरण में विधि का उपयोग करने से पहले यह ठीक से जवाब देने के लिए एक बहुत महत्वपूर्ण सवाल है , लेकिन यह एक अलग सवाल है कि मुझे क्या लगता है कि आप के बारे में पूछ रहे हैं।


0

पिछले उत्तरों को जोड़ने के लिए, यहाँ इस प्रश्न के बारे में सोचने का एक आसान तरीका है।

यह सभी यादृच्छिक और नियतात्मक के बीच अंतर के बारे में है । हम वॉन न्यूमैन के पास आएंगे और जो कह रहे थे, उसके बाद करेंगे।

रैंडम नंबर

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

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

  • "अच्छा" स्रोत एक रेडियोधर्मी क्षय प्रक्रिया, या अन्य क्वांटम प्रक्रिया की प्रतीक्षा करने के समान हैं जो स्वाभाविक रूप से अप्रत्याशित हैं। एक गर्मी संवेदनशील अर्धचालक से उत्पादन। एक डायोड या अन्य विद्युत सामग्री में यादृच्छिक शोर। सूर्य से फोटॉन की गिनती।

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

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

नियत संख्या

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

इसलिए, उदाहरण के लिए, यदि आप 1 और 10 मिलियन के बीच की संख्या कहते हैं, तो इसे बाइनरी में लिखें, और इसे बार-बार "हैश" करें, आपको अंकों का एक सुंदर यादृच्छिक अनुक्रम मिलेगा। यह लगभग यादृच्छिक है - लेकिन यह वास्तव में यादृच्छिक नहीं है। आप एल्गोरिथ्म और किसी भी राज्य को देखते हुए अनुमान लगा सकते हैं कि अगला नंबर क्या होगा।

हम इसे "छद्म आयामी" कहते हैं क्योंकि यह दिखता है और मुख्य रूप से यादृच्छिक लगता है, भले ही यह न हो।

यहाँ एक अच्छा उदाहरण है। 3 अंकों के इस क्रम के बारे में सोचें "यादृच्छिक संख्याएं": 983, 367, 336, 244, 065, 664, 308, 602, 139, 494, 639, 522, 473, 719, 070, 217। आइए आपको बताते हैं कि मैं आपको बताता हूं। मैं उसी तरह एक लाख संख्या उत्पन्न कर सकता हूं। फिर आप एक सांख्यिकीविद् के पास जा सकते हैं जो इस बात की पुष्टि करेगा (कहें) कि वे समान रूप से वितरित किए गए हैं या जो कुछ भी हो सकता है। कोई स्पष्ट अनुमानित पैटर्न नहीं है। वे बहुत यादृच्छिक लग रही है, है ना? लेकिन अब मैं आपको बताता हूं कि वे वास्तव में हैं

पी के 500 वें + अंक, 3s में समूहीकृत।

अचानक, हालांकि यादृच्छिक

पाई के अंक

हो सकता है, आप तुरंत अनुमान लगा सकते हैं कि अगले 2 नंबर 986 और 094 होंगे।

स्पष्ट होने के लिए, मुझे नहीं पता कि कैसे यादृच्छिक है

पाई के अंक

कर रहे हैं। इसका अध्ययन किया गया होगा और उत्तर अच्छी तरह से ज्ञात होगा। लेकिन बिंदु यह है: सिद्धांत रूप में, किसी भी स्रोत के लिए वही निष्कर्ष सही है जो एक निर्धारक प्रक्रिया के बाद उत्पन्न होता है

के बीच में

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

वापस वॉन न्यूमैन और आपके सवाल पर

जैसा कि आप देख सकते हैं, नियतात्मक आउटपुट यादृच्छिक दिख सकते हैं, लेकिन सांख्यिकीय रूप से वितरित भी हो सकते हैं। वे शायद "गुप्त" या तेजी से बदलते डेटा का भी उपयोग कर सकते हैं, जिसे जानने की हमें कोई वास्तविक आशा नहीं है। लेकिन जब तक यह नियतात्मक है, तब भी संख्या वास्तव में कभी भी यादृच्छिक नहीं हो सकती है । वे केवल "यादृच्छिक के करीब पर्याप्त हो सकते हैं कि हम अंतर को भूलकर खुश हैं"।

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

अब हम आपके प्रश्न को इस तरह दोहरा सकते हैं: "मेरा (या कोई भी आधुनिक) कंप्यूटर का आउटपुट पूरी तरह से बेतरतीब ढंग से देख और व्यवहार कर सकता है, क्या इसका मतलब है कि वॉन न्यूमैन का उद्धरण अब पुराना और गलत है?"

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

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

वॉन न्यूमैन दोनों तरह से जीतते हैं, लगभग परिभाषा के अनुसार!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.