2009-09-09 18 views
9

मैं समझता हूं कि समय (0) आम तौर पर यादृच्छिक संख्या जेनरेटर बीजिंग के लिए उपयोग कर रहा है और यह केवल एक समस्या बन जाती है जब कार्यक्रम प्रति सेकंड एक से अधिक बार चलाया जा रहा है। मैं सोच रहा हूं कि यादृच्छिक संख्या उत्पन्न करते समय विचार करने के लिए कुछ बेहतर बीज क्या हैं। मैंने विंडोज पर GetTickCount, TimeGetTime, और QueryPerformanceCounter के बारे में पढ़ा है। क्या ये लगभग सभी परिचालनों के लिए पर्याप्त होंगे या बेहतर बीजिंग विकल्प भी होंगे?समय से बेहतर बीज (0)?

यहां एक त्वरित कोड बढ़ावा लाइब्रेरी का उपयोग कर उदाहरण है:

#include <iostream> 
#include <boost/random.hpp> 
using namespace std; 
using namespace boost; 

int main() 
{ 
    mt19937 randGen(42); 
    uniform_int<> range(0,100); 
    variate_generator<mt19937&, uniform_int<> > GetRand(randGen, range); 

    for (int i = 0; i < 30; ++i) 
     cout << GetRand() << endl; 
} 
+0

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

+0

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

उत्तर

12

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

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

आप विश्व स्तर के अनियमितता की जरूरत है, आप अपने सिस्टम है कि एक अत्यधिक यादृच्छिक संख्या के लिए प्रदान करता है करने के लिए हार्डवेयर जोड़ सकते हैं। इस तरह प्रसिद्ध पोकर साइटें इसे करती हैं (कम से कम, वे यही कहते हैं)।

कि की कमी, एक बहुत ही सभ्य बीज बनाने के लिए, अपने सिस्टम है कि सभी स्वतंत्र रूप से और तेजी से बदलने के लिए, यथासंभव कम पूर्वानुमान के साथ से कारकों की एक संख्या गठबंधन। SO पर किसी संबंधित पोस्ट का उत्तर Guid.NewGuid()। GetHashCode() का उपयोग करके सुझाया गया है।

WinAPI GUID जनरेटर के क्रिप्टएनालिसिस से पता चलता V4 GUIDs की अनुक्रम है के बाद से है कि, चूंकि एक Guid समय सहित नियतात्मक कारकों की एक संख्या पर आधारित है, कि एक बीज के लिए एक अच्छा आधार के रूप में नहीं है छद्म यादृच्छिक, प्रारंभिक अवस्था एक अगले 250 000 GUIDs समारोह UuidCreate द्वारा वापस करने के लिए भविष्यवाणी कर सकते हैं को देखते हुए [2]। यही कारण है कि GUIDs क्रिप्टोग्राफ़ी में उपयोग नहीं किया जाना चाहिए, उदा।, यादृच्छिक कुंजी के रूप में।

स्रोत: से/dev कुछ बाइट्स/अपने RNG के लिए एक बीज के रूप में यादृच्छिक Wikipedia Globally Unique Identifier

5

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

ही एक मामला है जिसमें यह उपयोगी हो सकता है, क्रिप्टोग्राफिक अनुप्रयोगों के लिए है, क्योंकि समय (0) का अनुमान लगाना अपेक्षाकृत आसान है।

4

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

  • ढेर पर एक unintialized यादृच्छिक आकार चार सरणी घोषित
  • आवंटित स्मृति
  • के एक यादृच्छिक बाइट्स माउस को स्थानांतरित करने के लिए
  • सीडी ड्राइव में यादृच्छिक सीडी डाल दिया और उपयोगकर्ता के माइक्रोफ़ोन खोलने पहला ट्रैक
  • से यादृच्छिक स्थान पर यादृच्छिक बाइट्स पढ़ने के लिए उपयोगकर्ता पूछना उपयोगकर्ता पूछ सकते हैं या कैमरा, इनपुट के सेकंड की यादृच्छिक संख्या इकट्ठा, आह गणना राख और बीज
  • विंडोज: CryptGenRandom का उपयोग क्रिप्टोग्राफी द्वारा यादृच्छिक बाइट्स की एक बफर प्राप्त करने के लिए
  • यूनिक्स: के रूप में दूसरों उल्लेख किया है, यूनिक्स पर से /dev/random
+0

दूसरे दो शायद उनके लायक होने की तुलना में अधिक परेशानी होगी: डी –

+0

इस पर निर्भर करता है कि @trikker के लिए बीज यादृच्छिकता कितनी महत्वपूर्ण है :-) –

4

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

1

टिककआउट() या उच्च आवृत्ति वाले किसी भी चीज़ का उपयोग करना एक बुरा विचार है। यह कूटर चक्रों को शून्य से बहुत जल्दी वापस ले जाता है इस प्रकार एक ही बीज होने की संभावना देता है।

time(NULL): Repeats every 64 years. 
tickCouter() Repeats every X days. 

आप कोशिश करते हैं और प्रकृति से कुछ यादृच्छिक मूल्य मिल सकता है।
लाइटनिंग पिछले दूसरे में दुनिया भर में हमला करता है (जाहिर है कि ऑनलाइन है)? (आपको यह देखने के लिए शोध करने की आवश्यकता हो सकती है कि यह वैरिएबल है या नहीं)।

+2

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

+1

टिक काउंटर चक्र बहुत जल्दी से, और समय (0) के साथ समस्या यह है कि यह चक्र धीरे-धीरे धीरे-धीरे होता है, स्पष्ट समाधान दोनों के साथ बीज होता है। यदि आपका आरएनजी बीज 16 या 32 बिट्स तक सीमित है तो आपको परेशानी हो रही है। उस स्थिति में, टिक काउंटर के साथ अपने आरएनजी बीज, और उस से कुछ बिट्स बचाओ। समय (0) के साथ reseed और प्रारंभिक रूप से सहेजे गए बिट्स का उपयोग कर कई प्रारंभिक मूल्यों, या XOR सभी बाद के परिणामों को त्यागें। – MSalters

+0

इस पर वोट देना सिर्फ इसलिए कि प्रतिक्रिया बॉक्स से बाहर थी। – trikker

6

एक टिप्पणी लेकिन ऑनलाइन पोकर के शुरुआती दिनों में 32 बिट के बीज के बारे में दिलचस्प कहानी के लिए बहुत लंबा

की उथल ASF सॉफ्टवेयर में प्रयोग किया जाता एल्गोरिथ्म हमेशा ताश के पत्तों की एक आदेश दिया डेक के साथ शुरू होता है, और फिर यादृच्छिक संख्या का अनुक्रम उत्पन्न करता है जो डेक को पुन: व्यवस्थित करने के लिए उपयोग किया जाता है। ताश के पत्तों की एक वास्तविक डेक में, वहाँ 52 कर रहे हैं! (~ 2^226) संभव अद्वितीय शफल। कि याद एक 32-बिट यादृच्छिक संख्या जनरेटर के लिए बीज एक 32-बिट संख्या, अर्थ 4 सिर्फ अरब संभव बीज देखते हैं कि होना चाहिए। चूंकि डेक को फिर से शुरू किया गया है और जेनरेटर प्रत्येक शफल से पहले संशोधित है, केवल 4 बिलियन संभावित शफल इस एल्गोरिदम से परिणाम दे सकते हैं। 4 बी संभव शफ़ल 52 से चिंताजनक कम है !.

इस भेद्यता का शोषण करने के लिए आरएसटी-विकसित टूल डेक जाने के लिए पांच कार्ड की आवश्यकता है। पांच ज्ञात कार्ड के आधार पर, कार्यक्रम कुछ लाख संभव शफ़ल के माध्यम से खोज करता है और deduces जो एक एक आदर्श मुकाबला नहीं है। के मामले में टेक्सास उन्हें पोकर पकड़ो, इसका मतलब है कार्यक्रम कि धोखाधड़ी खिलाड़ी बांटा जाता है, प्लस पहले तीन समुदाय कार्ड इनपुट के रूप में लेता है दो कार्ड कि चेहरा पेश किया है (फ्लॉप)। ये पांच कार्ड सट्टेबाजी के चार राउंडों में से पहले के बाद जाने जाते हैं, और निर्धारित करने के लिए पर्याप्त हैं (वास्तविक समय में, नाटक के दौरान) सटीक शफल। http://www.random.org/

वायर्ड दो लोग हैं, जो मूल रूप से एक से शोर इस्तेमाल किया पर एक लेख भागा:

http://www.ibm.com/developerworks/library/s-playing/

2

एक वेब सेवा है कि स्वतंत्र और भुगतान किया "सही" यादृच्छिक वायुमंडलीय शोर से उत्पन्न बिट्स प्रदान करता है वेब कैमरा सीसीडी चिप यादृच्छिक संख्या उत्पन्न करने के लिए: http://www.wired.com/wired/archive/11.08/random.html

1

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

+0

क्या आपका मतलब बाहर निकलने पर आरएनजी के वर्तमान मूल्य को स्टोर करना है और अगले भाग पर बीज के रूप में उपयोग करना है? – Patrick

0

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

इसी प्रकार अपने कोड में एक बार आरएनजी बीज करने का प्रयास करें और फिर उसी उदाहरण का उपयोग करें जहां कहीं भी एक नए बीज के साथ एक नया बीज बनाने के बजाय आवश्यक है।

+0

पैट्रिक, पीआरएनजी का उपयोग अन्य पीआरएनजी के बीज के लिए बहुत गंभीर परिणाम हैं और इससे बचा जाना चाहिए (जब तक कि आप पूरी तरह से नहीं जानते कि आप क्या कर रहे हैं- इस काम को करने के तरीके हैं, इनमें से कोई भी भद्दा या आसान नहीं है)। – Joey

+0

क्या परिणाम हैं? हम यहाँ क्रिप्टोग्राफिक रूप से सुरक्षित आरएनजी के बारे में बात नहीं कर रहे हैं ... – Patrick

+1

यह सिमुलेशन और अन्य गैर-क्रिप्टो कार्यों के लिए भी उन्हें बर्बाद कर देता है। यह समान कारणों में समानांतर और वितरित सिमुलेशन में पीआरएनजी का सही उपयोग करने का एक कारण है। – Joey

0

का उपयोग करना (केवल) PRNG बीज के रूप में समय मूल रूप से दो समस्याएं हैं:

  1. यह उम्मीद के मुताबिक
  2. लगातार बीज काफी रैखिक निर्भरता (जो यह क्रिप्टो के लिए अनुपयुक्त बनाता है) है

पहली समस्या के लिए, आमतौर पर यह अनिवार्य है कि आप एन्ट्रॉपी के कई स्रोत लेते हैं जिन्हें आप अपना हाथ ले सकते हैं।

दूसरी समस्या के लिए, मकोटो मत्सुमोतो द्वारा पेपर Common defects in initialization of pseudorandom number generators कुछ अंतर्दृष्टि दे सकता है।

1

चूंकि आप पहले ही बूस्ट का उपयोग कर रहे हैं, तो शायद आप boost::random_device चाहते हैं।

(लिनक्स पर कम से कम। मुझे याद है नहीं है कि क्या यह स्पष्ट CryptGenRandom कार्यान्वयन विंडोज पर अभी तक उपलब्ध है।)

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