我正在阅读Brian W.Kernighan和Dennis M.Ritchie所着的名为c编程语言的书。我无法理解本书中用于生成伪随机数的函数,就像这样;
unsigned long int next = 1;
int rand(void)
{
next = next * 1103515243 + 12345;
return (unsigned int)(next / 65536) % 32768;
}
void srand(unsigned int seed)
{
next = seed;
}
我也尝试过自己。但我只想出了以下观察
65536 =是16位无符号+ 1位
的值 32768 =是值 16位带符号+ 1位
但我无法弄清楚整个过程。 这是传说中写的书,我想了解这本书。 如果有人能帮我解决这个问题,我会非常非常幸运。
答案 0 :(得分:4)
Pseudo Random Number Generators是一个非常复杂的主题。你可以学习它多年,并获得博士学位。如评论所述,请阅读linear congruential generator(在某些C标准中,您的代码看起来像示例)
在POSIX系统上的C中,您有random(3)(以及lrand48(3),已过时);在C ++ 11中,您有<random>
/65536
操作可能编译为>>16
右移16位。
%32768
操作可以是optimized作为位掩码(与&0x7fff
相同)保留15位。