initstate()
は、次の乱数 の情報を格納するために使用するバッファをランダムに示します。バッファstate1[256]
の情報が変更されたため、random()
へのコールで異なる回答が得られます。次のコードの出力を見てください:
#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());
}
は、これは、出力を与える:あなたはrandom()
に最初の呼び出しの後のバッファstate1
変更の内容を見ることができることを
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
。 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());
Cのみ 'rand'と' srand'とどちら 'random'、' initstate'または 'setstate'を持っています。あなたの質問にOSにタグを付けてください。 –
@JensGustedt bsdタグを追加しました。 – unwind
'gcc(Debian 4.4.5-8)4.4.5を使ってDebian(安定版)でこの例を実行すると、3つのコードスニペットすべてで同じ2つの数字が得られます。 – alk