2009-05-26 43 views
11

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

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

+2

क्या आप एक GUID जनरेटर चाहते हैं? यदि ऐसा है, तो कृपया उस भाषा और ओएस को प्रदान करें जिसमें आप काम कर रहे हैं। हम आपको बताएंगे कि आपके प्लेटफ़ॉर्म के लिए GUID लाइब्रेरी का उपयोग कैसे करें। –

+0

डुप्लिकेट (लगभग) http://stackoverflow.com/questions/506118/how-to-manually-generate-random-numbers –

+0

@ S.Lott: ya। मैं विंडोज एक्सपी और सी # में वीएस2005 का उपयोग कर रहा हूं। @ बाइनरी वर्रियर: क्षमा करें क्योंकि मुझे यह पोस्ट करते समय उस स्टैक ओवरफ्लो प्रश्न को नहीं मिला। – SyncMaster

उत्तर

18

पहला: यदि संख्या दोहराने की गारंटी नहीं है, तो यह बहुत यादृच्छिक नहीं है।

दूसरा: PRNG algorithms बहुत सारे हैं।

अद्यतन:

तीसरा: वहाँ है एक IETF RFC for UUIDs (क्या एमएस कॉल GUIDs), लेकिन आप की पहचान करनी चाहिए कि (यू | जी) UID, नहीं क्रिप्टोग्राफी द्वारा सुरक्षित हैं कि यदि आप के लिए एक चिंता का विषय है।

अद्यतन 2:

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

अद्यतन 3:

यहाँ docs for .NET's GUID

+0

+1: मुझे विश्वास है कि सभी आधार शामिल हैं, अगर यह पूछे गए प्रश्न का उत्तर नहीं देता है, तो कुछ भी नहीं होगा :) –

+0

दिलचस्प बात यह है कि एलसीजी (http://en.wikipedia.org/wiki/Linear_congruential_generator) है केवल पिछले मूल्य से बीजित, यह एक गैर दोहराव अनुक्रम बना देगा। यही है, पूरे अनुक्रम दोहराए जाने तक कोई दोहराना नहीं होगा। – Sionide21

+1

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

0

अधिकांश यादृच्छिक संख्या जनरेटर के पास "मूल्यवान रूप से" बीज मूल्य को पुन: प्रारंभ करने का एक तरीका है। (कभी-कभी यादृच्छिक कहा जाता है)।

यदि यह संभव नहीं है, तो आप बीज को प्रारंभ करने के लिए सिस्टम घड़ी का भी उपयोग कर सकते हैं।

+1

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

3

है तरीकों से आप यादृच्छिक संख्या उत्पन्न कर सकता है की एक बहुत कुछ कर रहे हैं। यह आमतौर पर एक सिस्टम/लाइब्रेरी कॉल के साथ किया जाता है जो एक बीज के साथ छद्म-संख्या जनरेटर का उपयोग करता है जैसा कि आपने पहले ही वर्णन किया है।

लेकिन, यादृच्छिक संख्या प्राप्त करने के अन्य तरीके हैं जिनमें विशेष यादृच्छिक संख्या प्राप्त करने के लिए विशेष हार्डवेयर शामिल हैं। मुझे कुछ poker sites पता है जो इस तरह के हार्डवेयर का उपयोग करते हैं। यह पढ़ना बहुत दिलचस्प है कि वे इसे कैसे करते हैं।

+0

संभवतः यह क्षय कणों को देखने पर आधारित है? अरे, मेरा अगला आधा घंटा चला जाता है। – annakata

+0

हेहेहेहेहेहेहेहेहे –

+1

यह अपने घुटने के पास रखे गए कुछ डायोड का उपयोग करके किया जा सकता है (क्या यह शब्द अंग्रेजी में है?) जहां यह बहुत अस्थिर है और वर्तमान में गुजरने के लिए यादृच्छिक रूप से चालू होने से स्विच कर सकता है। –

0

आप इस कोड नमूना इस्तेमाल कर सकते हैं: http://xkcd.com/221/ या, आप इस पुस्तक का उपयोग कर सकते हैं: http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477

लेकिन गंभीरता से, यह अपने आप को लागू नहीं करते, किसी मौजूदा पुस्तकालय का उपयोग करें। ऐसा करने वाला पहला व्यक्ति नहीं हो सकता है।

0

विशेष रूप से जावा के बारे में:

  • java.util.Random एक linear congruential generator का उपयोग करता है, जो not very good
  • java.util.UUID#randomUUID() का उपयोग करता java.security.SecureRandom, क्रिप्टोग्राफी द्वारा सुरक्षित RNGs की एक किस्म के लिए एक इंटरफेस है - डिफ़ॉल्ट SHA-1 पर आधारित है, मेरा मानना ​​है कि ।
  • UUIDs/GUIDs जरूरी यादृच्छिक नहीं हैं
  • यह Mersenne Twister या multiply-with-carry
0

मैं समझता हूँ कि आप एक तरह से उत्पन्न करने के लिए मांग कर रहे हैं के रूप में है कि java.util.Random तुलना में काफी बेहतर हैं नेट पर RNGs के कार्यान्वयन, खोजने के लिए आसान है सी # का उपयोग कर यादृच्छिक संख्या। यदि हां, RNGCryptoServiceProvider वह है जो आप ढूंढ रहे हैं।

[संपादित करें]

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

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

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