询问glibc伪随机数生成器LCG的模数及stdlib中rand()的模数
关于stdlib中rand()的LCG模数疑问解答
C标准的规定:C标准(如n1570)并未强制要求
rand()必须使用线性同余生成器(LCG),仅在附录中提供了一个可移植的示例实现。该示例通过无符号整数溢出的特性,隐式采用了2^32作为模数:static unsigned long int next = 1; int rand(void) { next = next * 1103515245 + 12345; // 隐式模2^32(unsigned溢出行为) return (unsigned int)(next / 65536) % 32768; }这个实现完全符合标准要求,你自己实现并测试的版本运行正常是合理的。
GCC/ANSI C的维基表格差异:维基百科中提到的
2^31模数,通常对应旧版本GCC(如早期glibc)的rand()实现——这类实现直接使用2^31作为显式模数,输出范围同样满足标准对rand()的要求(返回0到RAND_MAX,至少为32767)。stdlib中rand()的模数不统一:不同标准库的
rand()实现差异很大:- 部分旧版实现使用
2^31模数的LCG; - 遵循C标准示例的实现使用
2^32模数的LCG; - 现代主流标准库(如新版glibc、musl)已经弃用简单LCG,转而采用质量更高的随机生成算法(如MT19937变种)。
- 部分旧版实现使用
所以不能笼统地说stdlib的rand()一定使用2^32模数,具体取决于你使用的标准库版本和平台。
内容的提问来源于stack exchange,提问作者Daan
相关产品推荐
相关产品推荐

