如何用C++11标准库<random>实现与srand()、rand()完全一致的随机序列
这一需求无法实现跨平台/跨编译器的通用适配,但在固定编译运行环境下可以实现。
具体说明
- C++标准从未规定
rand()的底层实现逻辑,不同运行时库的rand()实现差异极大:常见的glibc环境使用参数为a=1103515245、c=12345、m=2^31的线性同余生成器(LCG),返回生成值的高16位作为结果;MSVC环境使用参数为a=214013、c=2531011、m=2^31的LCG,返回生成值的高15位作为结果。 - 若你明确当前代码运行环境的
rand()算法参数,可直接用C++11<random>库提供的std::linear_congruential_engine模板配置对应参数,再匹配对应输出截断逻辑,即可得到与rand()完全一致的输出序列,同时该引擎对象本身支持直接读写状态,可完美解决你需要保存/恢复随机数生成器状态的需求。 - 如果你的代码需要跨不同编译器、不同操作系统运行,无法实现全局统一的匹配:因为不同平台原生
rand()的输出本身就不统一,这是rand()的原生设计缺陷,和<random>库无关。
代码示例(适配glibc环境rand())
#include <random> // 配置与glibc rand()一致的LCG参数 std::linear_congruential_engine<uint32_t, 1103515245, 12345, 1ULL << 31> g_rand_gen; // 等价于glibc的rand()调用 int compatible_rand() { return static_cast<int>((g_rand_gen() >> 16) & 0x7FFF); } // 等价于srand(seed)初始化 void compatible_srand(unsigned int seed) { g_rand_gen.seed(seed); }
内容的提问来源于stack exchange,提问作者user122049
相关产品推荐
相关产品推荐

