2012-12-18 20 views
5

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

int myrand(int random_seed){ 
    random_seed = random_seed * 1103515245 +12345; 
    return (unsigned int)(random_seed/65536) % 32768; 
          } 

हर बार जब मैं फ़ंक्शन को कॉल मैं द्वारा 1.

बीज वृद्धि दूसरा तरीका time.Time परिवर्तन का उपयोग करना है और इस randomness.I भी कई तरह से करने की कोशिश की है इसे लागू करने के लिए। मेरी नवीनतम कोशिश यहां है: Compiler error-Possible IDE error"undefined reference to gettimeofday error" लेकिन मैं gettimeofday फ़ंक्शन का उपयोग नहीं कर सका क्योंकि मैं विंडोज़ में काम करता हूं। इस सवाल में मुझे कोई जवाब नहीं मिला।

क्या कोई मुझे विंडोज़ में काम कर रहे सी में यादृच्छिक जनरेटर (शायद समय का उपयोग कर) को कैसे कार्यान्वित कर सकता है? या मुझे यूनिक्स का उपयोग करना चाहिए?

+2

कुछ के साथ कुछ गलत है 'srand()'? आप बीज कर सकते हैं यह इस तरह का समय होगा: 'srand (समय (एनयूएलएल));' –

+0

मैंने एसआरएंड (समय (एनयूएलएल) भी कोशिश की) लेकिन मुझे समय बदलने के लिए देरी करना पड़ा। कारण यह है कि मैं एक बार में यादृच्छिक संख्याओं की एक बड़ी राशि उत्पन्न करना चाहता हूं और मैं प्रोग्राम को उत्पन्न करने के लिए 2 मिनट का इंतजार नहीं करना चाहता हूं। मैंने मिलीसेकंड का उपयोग करने की भी कोशिश की लेकिन बिना किसी सफलता के। मेबे मिलीसेकंड जवाब है लेकिन मैं नहीं कर सकता इसे सही कार्यान्वित करें, फिर समस्या यह थी कि मैं खिड़कियों का उपयोग कर रहा हूं। – Dchris

+2

@Dchris: प्रोग्राम की शुरुआत में * एक बार * समय के साथ अपने छद्म-यादृच्छिक संख्या जनरेटर (पीआरएनजी) को बीज दें। फिर आपको यह सुनिश्चित करना होगा कि प्रति दिन एक से अधिक बार अपने प्रोग्राम को न चलाएं (और मिलीसेकंड को उसमें मदद मिलेगी), लेकिन जब भी आप अपने पीआरएनजी से कोई संख्या पढ़ते हैं तो आपको एक सेकंड का इंतजार नहीं करना पड़ता है। –

उत्तर

4

एंट्रॉपी के अच्छे स्रोत के साथ अपने आरएनजी को बीज दें।

यूनिक्स के तहत, उपयोग/dev/random।

खिड़कियों के तहत, CryptoAPI की तरह कुछ का उपयोग करें - Windows equivalent of /dev/random

+1

यह केवल महत्वपूर्ण यादृच्छिकता के लिए है।/Dev/random से पढ़ना एंट्रॉपी की प्रणाली को मिटा देगा, जिसके परिणामस्वरूप अंत में खाली होने पर अवरुद्ध हो जाएगा, जब तक सिस्टम ने अधिक एन्ट्रॉपी एकत्र नहीं की हो। बेशक ओपी ने यह नहीं बताया कि वह जिस समस्या को हल करने की कोशिश कर रहा है वह सुरक्षा से संबंधित है या नहीं। मुझे संदेह है कि यह नहीं है। –

+0

ध्यान दिया गया है कि आप बस उस तरह से आरएनजी बीज कर सकते हैं। –

+1

सी ++ 11 पर आप ['std :: random_device'] (http://en.cppreference.com/w/cpp/numeric/random/random_device) का उपयोग कर सकते हैं जो संभावित रूप से यादृच्छिक डेटा के किसी भी स्रोत का उपयोग करेगा प्रणाली। –

3

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

तुम सब करने की ज़रूरत बीज है यह एक बार कार्यक्रम स्टार्टअप पर:

srand(time(NULL)); 

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

बाद में इसे बीजिंग में कोई नुकसान नहीं होता है, लेकिन इसमें कोई भी बिंदु नहीं है।

+0

रिसाइडिंग को हल्के ढंग से नहीं लिया जाना चाहिए। पीआरएनजी एल्गोरिदम शोधन के आधार पर एंट्रॉपी बढ़ाने के लिए वांछनीय हो सकता है लेकिन खराब शोधन के आधार पर शोध और क्रिप्टोग्राफिक्स हमलों के निश्चित रूप से सही और गलत तरीके हैं। जैसा कि आपने कहा है कि सरल पीआरएनजी उपयोग के लिए शोधन आमतौर पर नुकीला नहीं है। उदाहरण के लिए एमटी एल्गोरिदम अपने आप को दोहराने से पहले एक आश्चर्यजनक 2^19937-1 संख्या उत्पन्न कर सकता है। साइक्लिंग से पहले 2^32 संख्याओं के लिए अन्य अच्छे हैं। – bot403

1

सी मानक लाइब्रेरी में हेडर टाइम.h है (या सीटा अगर आप सी ++ का उपयोग कर रहे हैं) (reference)। विंडोज और यूनिक्स में फ़ंक्शंस समर्थित होंगे।

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

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

0

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

0

जब से तुम मैं srand() के लिए एक बीज के रूप में time(NULL) या clock() से बचने के लिए के बाद से अपने विवरण के स्तर को बहुत (ms) सीमित है सुझाव देंगे एक Windows समाधान के लिए स्पष्ट रूप से कह रहे हैं उत्पन्न करता है।

LARGE_INTEGER PerformanceCount; 
QueryPerformanceCounter(&PerformanceCount); 
srand(PerformanceCount.LowPart); 

QueryPerformanceCounter() की आवृत्ति की वेतन वृद्धि दर QueryPerformanceFrequency() के लिए एक कॉल के द्वारा प्राप्त किया जा सकता है: इसके बजाय आप प्रदर्शन काउंटर का परिणाम इस्तेमाल कर सकते हैं। यह आमतौर पर कम से कम 1 मेगाहर्ट्ज और कभी-कभी GHz रेंज में भी बढ़ता है। इसलिए यह बीज के लिए एक तेजी से बदलती स्रोत प्रदान करता है।

संपादित करें: के रूप में अपने earlier question से समझा भी एक gettimeofday() एक जैसे कार्यान्वयन ठीक विवरण के स्तर को नहीं देंगे। यह tv_usec शब्द को अपने तर्क में दिखा सकता है लेकिन विन्डोज़ पर यह माइक्रोसॉन्ड ग्रैन्युलरिटी प्रदान नहीं करेगा क्योंकि यह लिनक्स सिस्टम पर करता है।

0

बोली:

यादृच्छिक की

to make a random generator that not only generates a different number every time i run the generator

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

यदि आप कार्ड के डेक से निपट रहे हैं तो यह आपके डुप्लीकेट के मानदंड को पूरा नहीं करता है। डेक डीलिंग दृष्टिकोण का उपयोग करना "प्रयुक्त" संख्याओं का ट्रैक रखना है।

आपको यह भी पता होना चाहिए कि पीएनआरजी (छद्म यादृच्छिक संख्या जेनरेटर) चक्रीय (आवधिक) हैं। आपके द्वारा उत्पन्न संख्याओं के बाद, आमतौर पर एक बड़ी संख्या, फिर आप फिर से शुरू करते हैं और संख्याओं के नाम अनुक्रम को दोहराते हैं। यूनिक्स rand() समारोह रेंज में पूर्णांक पूर्णांक उत्पन्न करता है [0, {RAND_MAX}] और 2^32

की अवधि है वास्तव में इस छोटे से पेज पढ़ने पर विचार करें:

देखें: http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html

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