2016-02-17 21 views
5

मैं प्रोग्राम है जो पासा रोलजावा यादृच्छिक जनरेटर कैसे काम करता है?

Random r = new Random(); 
    int result = r.nextInt(6); 
    System.out.println(result); 

मैं एक तरह से करने के लिए "भविष्यवाणी" अगले जनरेट की गई संख्या वहाँ है अगर जानना चाहते हैं और कैसे JVM क्या संख्या अगले उत्पन्न करने के लिए निर्धारित करता है simulates लिखा?

क्या मेरे कोड आउटपुट नंबर किसी भी जेवीएम और ओएस पर वास्तविक यादृच्छिक के करीब होंगे?

+1

यह वास्तव में छद्म यादृच्छिक है। इसका मतलब है कि वे वास्तव में यादृच्छिक नहीं हैं। बस हर बार एक ही बीज का उपयोग करें और संख्या हमेशा एक ही होगी। क्यूं कर? क्या आप किसी को भविष्य की भविष्यवाणी करने में सक्षम होने के रूप में प्रभावित करने की कोशिश कर रहे हैं? : पी – Arc676

+0

आप दस्तावेज क्यों नहीं पढ़ते? https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#next-int- – the8472

+1

आपको यह दिलचस्प लगेगा कि आप एक पसंद यादृच्छिक बीज के साथ क्या कर सकते हैं। http://vanillajava.blogspot.co.uk/2011/10/randomly-no-so-random.html –

उत्तर

12

वे कूट-यादृच्छिक संख्या कर रहे हैं, जिसका अर्थ है कि सामान्य इरादों और मकसदों के लिए, वे काफी यादृच्छिक कर रहे हैं। हालांकि वे निर्धारक हैं और पूरी तरह से बीज पर निर्भर हैं। निम्न कोड एक ही 10 संख्याओं को दो बार प्रिंट करेगा।

Random rnd = new Random(1234); 
for(int i = 0;i < 10; i++) 
    System.out.println(rnd.nextInt(100)); 

rnd = new Random(1234); 
for(int i = 0;i < 10; i++) 
    System.out.println(rnd.nextInt(100)); 

आप बीज चयन कर सकते हैं, तो आपको पहले नंबर precalculate सकता है, तो एक ही बीज के साथ जनरेटर रीसेट और आप पहले से पता चल जाएगा कि क्या संख्या बाहर आते हैं।

1

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

कैसे एक यादृच्छिक संख्या जनरेटर पर हमला किया जा सकता है की एक उत्कृष्ट पहले हाथ खाते के लिए How We Learned to Cheat at Online Poker: A Study in Software Security पढ़ें। संक्षेप में, लेखकों ने यह पता लगाया कि ऑनलाइन पोकर साइट द्वारा नियोजित एक दोषपूर्ण शफलिंग एल्गोरिदम के आधार पर आरएनजी का क्या उपयोग किया जा रहा था। फिर उन्होंने हाथों को नमूना करके आरएनजी बीज का पता लगाया। एक बार उनके पास एल्गोरिदम और बीज था, उन्हें पता था कि बाद में शफल होने के बाद डेक की व्यवस्था कैसे की जाएगी।

इस link उल्लेख कर सकते हैं।

1

चेक How does java.util.Random work and how good is it:

दूसरे शब्दों में, हम कुछ शुरू या "बीज" संख्या जो आदर्श "सही मायने में अप्रत्याशित" है के साथ शुरू, और जो व्यवहार में "पर्याप्त अप्रत्याशित" है। उदाहरण के लिए, मिलीसेकंड की संख्या- या यहां तक ​​कि नैनोसेकंड- चूंकि कंप्यूटर चालू किया गया था, अधिकांश सिस्टम पर उपलब्ध है। फिर, हर बार जब हम एक यादृच्छिक संख्या चाहते हैं, तो हम वर्तमान बीज को कुछ निश्चित संख्या से गुणा करते हैं, ए, एक और निश्चित संख्या, सी, जोड़ें, फिर परिणाम मॉड्यूलो को एक और निश्चित संख्या, एम। संख्या आम तौर पर बड़ी है। यादृच्छिक संख्या पीढ़ी की यह विधि कंप्यूटिंग 1 की सुबह बहुत अधिक वापस जाती है। बहुत अधिक "आकस्मिक" यादृच्छिक संख्या जेनरेटर जो आप सोच सकते हैं- वैज्ञानिक कैलकुलेटर से लेकर 1 9 80 के दशक के कैलकुलेटर के लिए वर्तमान कंप्यूटर सी और विजुअल बेसिक लाइब्रेरी फ़ंक्शंस- इसकी यादृच्छिक संख्या उत्पन्न करने के लिए उपर्युक्त सूत्र के कुछ प्रकार का उपयोग करता है।

और यह भी Predicting the next Math.random() in Java

8

मैं अगर वहाँ एक रास्ता करने के लिए "भविष्यवाणी" अगले जनरेट की गई संख्या है जानना चाहता हूँ और कैसे JVM क्या संख्या अगले उत्पन्न करने के लिए निर्धारित करता है?

बिल्कुल। Random कक्षा को रैखिक संगत संख्या जनरेटर (एलसीएनजी) के रूप में लागू किया गया है।एक रैखिक congruential जनरेटर के लिए सामान्य सूत्र है:

new_state = (old_state * C1 + C2) modulo N 

सटीक Random द्वारा प्रयोग किया जाता एल्गोरिथ्म javadocs में निर्दिष्ट है। यदि आप जेनरेटर की वर्तमान स्थिति जानते हैं, तो अगला राज्य पूरी तरह अनुमानित है।

क्या मेरे कोड आउटपुट नंबर किसी भी जेवीएम और ओएस पर वास्तविक यादृच्छिक के करीब होंगे?

यदि आप Random का उपयोग करते हैं, तो नहीं। किसी भी ओएस पर किसी भी JVM के लिए नहीं।

एलसीएनजी द्वारा उत्पादित अनुक्रम निश्चित रूप से यादृच्छिक नहीं है, और इसमें सांख्यिकीय गुण हैं जो एक वास्तविक यादृच्छिक अनुक्रम से काफी अलग हैं। (अनुक्रम दृढ़ता से स्वतः सहसंबंधित होगा, और यदि आप Random.nextInt() पर लगातार कॉल के परिणाम प्लॉट करते हैं तो यह दिखाया जाएगा।)

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

+0

वर्तमान स्थिति से आपका क्या मतलब है? और क्या पूर्व राज्य बचाया गया है - यदि ऐसा है तो कैसे? – Lealo

+0

1) जेनरेटर (निजी) इंस्टेंस चर के मान। स्रोत कोड देखें। 2) AFAIK, संख्या –

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