2012-08-16 21 views
8

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

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

rng.seed = 1024; 
for (int i=1; i<11; i++) 
    DLog(@"%lu", [rng randomBetween:0 and:10]); 

कौन सा मुझे अनुक्रम 10, 10, 8, 10, 2, 10, 9, 9, 7, 4 देता है:

मैं निम्न कार्य कहो। संख्या 1024 प्राप्त करने के लिए अनुक्रम दिया गया है, क्या मैं कुछ विधि या एल्गोरिदम का उपयोग कर सकता हूं? मुझे पता है कि देखा गया 1024 के लिए वैध अनुक्रम है, लेकिन मैं सिर्फ एक अनुक्रम बना रहा हूं ... 10, 1, 9, 6, 3, 9, 10, 3, 5, 2। क्या यह जानने का कोई तरीका है कि क्या यह इस एल्गोरिदम के लिए एक वैध अनुक्रम है और यदि ऐसा है तो बीज क्या है?

RNG.h:

@interface RNG : NSObject 
@property (assign) unsigned long seed; 
- (unsigned long)random; 
- (long)randomBetween: (long)min and: (long)max; 
@end 

RNG.m:

#define A 16807   /* a relatively prime number -- also M div Q */ 
#define M 2147483647L /* 0xFFFFFFFF/2 */ 
#define Q 127773L  /* M div A */ 
#define R 2836   /* M mod A */ 

@implementation RNG 
@synthesize seed = _seed; 

- (id)init { 
    self = [super init]; 
    if (self) { 
     self.seed = 0; 
    } 
    return self; 
} 


- (unsigned long)random { 
    self.seed = A * (self.seed % Q) - R * (self.seed/Q); 
    if (self.seed > M) 
     return (self.seed -= M); 
    else if (self.seed) 
     return (self.seed); 
    else 
     return (self.seed = 1L); 
} 


- (long)randomBetween: (long)min and: (long)max { 
    return ([self random] % (max - min + 1) + min); 
} 


- (void)seed: (unsigned long)new_seed { 
    if (new_seed == 0) 
     new_seed = 1; 
    while (new_seed > M) 
     new_seed -= M; 

    self.seed = new_seed; 
} 
@end 
+0

बीज की सीमा क्या है? आपके पास श्रृंखला कितनी लंबी है? [कबूतर सिद्धांत] से [http://en.wikipedia.org/wiki/Pigeonhole_principle), यदि आपके पास 2^32 संभव बीज हैं, यदि आपके सरणी में ~ 9 संख्याएं कम हैं, तो यह "टकराव" होने की गारंटी है (सरल उदाहरण: सीमाओं में आकार 1 के आकार 1 की सूची [0, 9], यदि आपके पास 9 संभावित बीज हैं, तो कम से कम 2 बीज होते हैं जो समान "सूची" देते हैं) – amit

+0

@amit - रेंज एक ' हस्ताक्षर किए गए लंबे ... ... कई संभावनाएं। मैं टकराव के बारे में चिंतित नहीं हूं, अगर अनुक्रम में फिट होने वाले दो या दो से अधिक बीज हैं, तो मुझे केवल पहले व्यक्ति की आवश्यकता है। – Justin808

+0

वह भाषा क्या है? –

उत्तर

3

यह एक "रैखिक congruential जनरेटर", http://en.wikipedia.org/wiki/Linear_congruential_generator देख "की तरह लग रहा

ये अच्छा नहीं क्रिप्टोग्राफिक सुरक्षा की पेशकश? , तो हाँ, अनुक्रम उत्पन्न करने वाले बीज की गणना करना संभव होना चाहिए।

3

आपके द्वारा पोस्ट किया गया कोड मूल रूप से openbsd srandom जैसा ही है - यह एक रैखिक संगत जनरेटर है जो गोल करने से बचने के लिए लागू किया गया है (यही कारण है कि इसमें Q शामिल है)।

here is a paper on how to crack such a generator, लेकिन यह पूर्ण आउटपुट ("बीच" मूल्य) उपलब्ध होने की अपेक्षा करता है।

मुझे लगता है कि आप अंकगणित मॉड्यूलो श्रेणी (संभवतः आपको अधिक नमूने की आवश्यकता होगी) का उपयोग करके "बीच" के साथ काम करने के लिए पेपर में दृष्टिकोण का विस्तार करने में सक्षम होना चाहिए।

0

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

यह मुझे उन लोगों में से एक जैसा लगता है "यह गणना योग्य है, लेकिन ..." समस्याएं। IOW, यह किया जा सकता है, लेकिन यह विशेष रूप से सुंदर नहीं है।

+0

मैं एक एल्गोरिदम प्राप्त करने की उम्मीद कर रहा हूं, मैं अपनी कक्षा में जोड़ने के लिए एक फ़ंक्शन में बदल सकता हूं ताकि डेटाबेस समाप्त हो जाएं। प्रत्येक बीज के माध्यम से ब्रूट फोर्स * काम करेगा लेकिन यह बेकार के बिंदु तक धीमा हो जाएगा। – Justin808