mówi losowo, jaki bufor użyć do przechowywania informacji o następnej losowej liczbie. Otrzymujesz różne odpowiedzi w rozmowach na numer random()
, ponieważ informacje w twoim buforze state1[256]
uległy zmianie.Spójrz na wyjściu następujący kod:
#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());
}
Daje wyjście:
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
Widać, że po pierwszym wywołaniu random()
zawartość bufora state1
zmian. random()
używa tego obszaru do przechowywania jego stanu. Ten stan jest kopiowany do bufora tmp
. Później kopiujemy go z powrotem do state1
i otrzymujemy tę samą sekwencję liczb losowych. Należy pamiętać, że przed skopiowaniem do bufora lub z bufora, który ma być użyty do liczb losowych, należy powiedzieć random()
, aby przestał używać tego bufora przy użyciu setstate()
lub initstate()
. Powodem jest to, że gdy wywoływany jest setstate()
, stary bufor jest modyfikowany, aby umożliwić jego ponowne ładowanie za pomocą setstate()
.
Tak, aby uzyskać tę samą odpowiedź jak w oryginalnym pytanie, trzeba użyć:
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 ma tylko 'rand' i' srand' i ani 'random',' lub 'setstate' initstate' . Oznacz swoje pytanie swoim systemem operacyjnym. –
@JensGustedt Dodałem tag bsd. – unwind
Uruchamianie tego przykładu na Debianie (stabilnym) przy użyciu 'gcc (Debian 4.4.5-8) 4.4.5' Otrzymuję te same dwie liczby dla wszystkich trzech fragmentów kodu. – alk