You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

询问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:32:19