我正在查看K&R2 2.7类型转换中的RNG:
unsigned long int next = 1;
/* rand: return pseudo-random integer on 0..32767 */
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next / 65536) % 32768;
}
/* srand: set seed for rand() */
void srand(unsigned int seed)
{
next = seed;
}
为什么在进行类型转换之前,next
要被 65536 整除后再转换为 unsigned int
?
我最初的直觉是与 int
是16位或者 RAND_MAX
当时是32767 有关,但是即使在当前我的机器上,int
是32位且 RAND_MAX
是2147483647,我仍然得到相同的结果(https://oeis.org/A061364)。
如果我遗漏了一些显而易见的东西,或者对于认为 K&R2 已经过时的人向大家道歉 - 这个例子仍然出现在 C 标准中,C17 7.22.2.2 The srand function,所以我假设我的问题在今天仍然有效。
return
语句更改为返回next%32768
或仅返回next
,然后编写一个循环打印几个连续的rand()%2
值。 - Steve Summit