随机数发生器的实现

Max*_*eel 4 c c++ random implementation

可能重复:
随机数生成器如何工作?

我正在寻找C/C++中随机数生成器的内部实现.基本上我很想知道调用rand()时究竟发生了什么.在所有机器遵循一定的指令后,它怎么可能是随机的!
编辑:想知道如何在C/C++中实现一个.

pax*_*blo 12

它们是伪随机数生成器,而不是真正随机生成器.这通常是一件好事,因为它允许您在涉及"随机"数字时更容易地重现错误.

可以得到随机数生成器,如阅读/dev/random在Linux下,但通常值与C库一般船舶都没有.

最简单的是线性同余生成器,其中:

n(x+1) = n(x) * A + C modulo M
Run Code Online (Sandbox Code Playgroud)

适当选择的和A,CM.

维基百科关于LCG的页面给出了各种实现使用的一些示例值.例如,glibc那里列出的那个有a = 1103515245, c = 12345, m = 2^31这样一个简单的事情:

static unsigned int seed = 1;
void srand (int newseed) {
    seed = (unsigned)newseed & 0x7fffffffU;
}
int rand (void) {
    seed = (seed * 1103515245U + 12345U) & 0x7fffffffU;
    return (int)seed;
}
Run Code Online (Sandbox Code Playgroud)

旁白:glibc的实现仍然有在它这个生成器(称为0型发生器),但它也有一个票友三项式发电机为好,这是(可能)更好.

还有更复杂的(如梅森捻线机)具有更长的循环时间(开始重复之前的时间).

任何真正随机的生成器必须使用真正随机的输入源,这就是为什么/dev/random有时会阻塞("等待熵")而/dev/urandom不会.

"真正的"随机源可能会受到按键之间的时间间隔,数据输入的数据,网络数据包的内容,磁盘I/O模式,ICMP响应通过网络返回所需的时间以及各种其他奇妙的影响.非确定性的东西.

除非你非常重视加密,否则正常的随机数生成器就可以了.