跨平台的一致的伪随机数

我正在寻找一种方法来生成伪随机数序列,这将为任何平台上的给定种子产生相同的序列结果。 我假设rand() / srand()不一致(我可能很容易对这个假设错误)。

像Mersenne Twister(来自Boost.Random)这样的东西是确定性的。

Knuth已经发布了“ 计算机编程艺术”第3.6节中描述的伪随机数生成器的公共域C(和FORTRAN)源代码 。

我意识到这是一个旧线程,但现在有了C ++ 11,有很多新选项可用 。 以下是页面中的一个提取示例,默认使用Mersenne Twister引擎和Normal分布:

 #include  #include  #include  #include  #include  int main() { std::random_device rd; // // Engines // std::mt19937 e2(rd()); //std::knuth_b e2(rd()); //std::default_random_engine e2(rd()) ; // // Distribtuions // std::normal_distribution<> dist(2, 2); //std::student_t_distribution<> dist(5); //std::poisson_distribution<> dist(2); //std::extreme_value_distribution<> dist(0,2); std::map hist; for (int n = 0; n < 10000; ++n) { ++hist[std::round(dist(e2))]; } for (auto p : hist) { std::cout << std::fixed << std::setprecision(1) << std::setw(2) << p.first << ' ' << std::string(p.second/200, '*') << '\n'; } } 

我一直在为一个simplerandom库工作。 它应该是跨平台的,我的目标也是针对多种语言。 目前它支持C和Python (在两种语言中生成相同的数字)。 我计划很快按照Boost和C ++ 11随机API在C ++中实现相同的生成器。

最简单的方法是自己编写一个随机数生成器,但使用为不同平台发布的库并保证提供相同的结果也可以。

我怀疑rand()/ srand()是否一致,但我不知道。

一个快速搜索的参考文献说:

具有相同种子的两个不同初始化指示伪随机生成器在两种情况下为随后的rand调用生成相同的连续结果。

但问题仍然存在。 我假设上述规范仅适用于同一过程中的RNG。 它很可能没有指定任何有关跨平台或交叉编译器的东西。 您最好的选择可能是找到适用于所有所需平台的库。 那么你应该相当安全,如果以相同的值播种,它们会返回相同的数字序列。