c中的伪随机函数?

时间:2015-08-26 11:51:34

标签: c++ c

我正在阅读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位

但我无法弄清楚整个过程。 这是传说中写的书,我想了解这本书。 如果有人能帮我解决这个问题,我会非常非常幸运。

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位。