initstate()
यादृच्छिक बताता है कि बफर अगले यादृच्छिक संख्या के लिए जानकारी स्टोर करने के लिए उपयोग करने के लिए। आपको random()
पर कॉल में अलग-अलग उत्तर मिलते हैं क्योंकि आपके बफर state1[256]
में जानकारी बदल गई है।निम्नलिखित कोड के उत्पादन को देखो:
#define LEN (32)
void print_hex(char *b)
{
int i;
for(i=0; i < LEN; i++) printf("%02x ",((unsigned char *)b)[i]);
printf("\n");
}
main()
{
char state1[256], state2[256], tmp[256];
initstate(42, state2, LEN);
initstate(62, state1, LEN) ;
printf("buffer before random():\n");
print_hex(state1) ;
printf("%10ld\n", random());
printf("buffer after random():\n");
print_hex(state1) ;
setstate(state2); // Now we are free to copy data from state1
printf("buffer after setstate():\n");
print_hex(state1) ;
memcpy(tmp, state1, 256);
printf("copied to tmp\n");
setstate(state1); // Go on with original sequence
printf("next random():\n") ;
printf("%10ld\n", random());
printf("next random():\n") ;
printf("%10ld\n", random());
setstate(state2) ; // Again, this allows us to play with data in state1
memcpy(state1, tmp, 256);
setstate(state1) ;
printf("back copy:\n");
printf("random() after copy:\n") ;
printf("%10ld\n", random());
printf("next random():\n") ;
printf("%10ld\n", random());
}
यह आउटपुट देता है:
buffer before random():
01 00 00 00 e7 22 1d 21 f1 62 9c 90 89 72 b5 89 35 2b 97 b5 76 8c ff a8 56 14 14 7b ba 19 d9 f7
1801070350
buffer after random():
01 00 00 00 e7 22 1d 21 f1 62 9c 90 89 72 b5 89 1c 4e b4 d6 76 8c ff a8 56 14 14 7b ba 19 d9 f7
buffer after setstate():
06 00 00 00 e7 22 1d 21 f1 62 9c 90 89 72 b5 89 1c 4e b4 d6 76 8c ff a8 56 14 14 7b ba 19 d9 f7
copied to tmp
next random():
483260339
next random():
40158063
back copy:
random() after copy:
483260339
next random():
40158063
आप बफर state1
की सामग्री बदलती random()
को देख सकते हैं कि पहली कॉल के बाद। random()
उस क्षेत्र का उपयोग अपने राज्य को संग्रहीत करने के लिए करता है। इस राज्य को बफर tmp
पर कॉपी किया गया है। बाद में हम इसे state1
पर कॉपी करते हैं, और यादृच्छिक संख्याओं का एक ही अनुक्रम प्राप्त करते हैं। ध्यान दें कि यादृच्छिक संख्याओं के लिए उपयोग किए जाने वाले बफर से कॉपी करने से पहले आपको या initstate()
का उपयोग करके उस बफर का उपयोग रोकने के लिए random()
बताना होगा। इसका कारण यह है कि जब setstate()
कहा जाता है, तो पुराने बफर को setstate()
के साथ फिर से लोड करने की अनुमति देने के लिए संशोधित किया जाता है।
तो मूल प्रश्न में के रूप में ही जवाब पाने के लिए, आप का उपयोग करना होगा:
unsigned int seed1 = 42;
char state1[256], tmp[256];
initstate(seed1, state1, 256);
printf("%10ld\n", random());
initstate(0, tmp, 256); // <- notice this
setstate(state1) ;
printf("%10ld\n", random());
सी केवल rand' और 'srand' और न' random', 'initstate' या' setstate' है ' । कृपया अपने प्रश्न को अपने ओएस के साथ टैग करें। –
@ जेन्सगस्टेड मैंने बीएसडी टैग जोड़ा। – unwind
'gcc (डेबियन 4.4.5-8) 4.4.5 का उपयोग करके डेबियन (स्थिर) पर इस उदाहरण को चला रहा है, मुझे तीनों कोड स्निपेट के लिए समान दो संख्याएं मिलती हैं। – alk