initstate()
cho biết bộ đệm nào sử dụng để lưu trữ thông tin cho số ngẫu nhiên tiếp theo. Bạn nhận được các câu trả lời khác nhau trong các cuộc gọi tới random()
vì thông tin trong bộ đệm của bạn state1[256]
đã thay đổi.Nhìn vào kết quả của đoạn mã sau:
#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());
}
này cho kết quả:
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
Bạn có thể thấy rằng sau khi cuộc gọi đầu tiên random()
các nội dung của bộ đệm state1
thay đổi. random()
sử dụng khu vực đó để lưu trữ trạng thái của nó. Trạng thái này được sao chép vào bộ đệm tmp
. Sau đó chúng tôi sao chép nó trở lại state1
và nhận được cùng một chuỗi các số ngẫu nhiên. Lưu ý rằng trước khi bạn sao chép vào hoặc từ bộ đệm được cho là được sử dụng cho các số ngẫu nhiên, bạn phải thông báo random()
để ngừng sử dụng bộ đệm đó bằng cách sử dụng setstate()
hoặc initstate()
. Lý do là khi setstate()
được gọi, bộ đệm cũ được sửa đổi để cho phép nó được tải lại với setstate()
.
Vì vậy, để có được câu trả lời tương tự như trong câu hỏi ban đầu, bạn phải sử dụng:
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());
C chỉ có 'rand' và' srand' và không 'random', 'initstate' hoặc' setstate' . Vui lòng gắn thẻ câu hỏi của bạn với hệ điều hành của bạn. –
@ JensGustedt Tôi đã thêm thẻ bsd. – unwind
Chạy ví dụ này trên Debian (ổn định) bằng cách sử dụng 'gcc (Debian 4.4.5-8) 4.4.5' Tôi nhận được hai số giống nhau cho cả ba đoạn mã. – alk