跨平台的一致的伪随机数

时间:2009-05-28 18:03:46

标签: c++ c random

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

6 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:8)

Knuth对于计算机编程艺术的第3.6节中描述的伪随机数生成器有released into the public domain C (and FORTRAN) source code

答案 2 :(得分:6)

我意识到这是一个旧线程,但现在使用C ++ 11,有一大堆new options available。以下是页面中的一个提取示例,默认使用Mersenne Twister引擎和Normal分发:

#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>

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<int, int> 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';
    }
}

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

快速用Google搜索reference说:

  

使用相同种子进行两次不同的初始化,指示伪随机生成器为后续调用rand生成相同的连续结果。

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