2009-05-28 25 views
24

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

+1

看到我的问题和答案C++ 11随机生成器。 C++ 11 mt19937在所有平台上提供了一致的结果,但标准分布并没有,所以我创建了自己的分布式:http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not -consistent-across-platforms-what-al – 2016-01-23 11:46:28

回答

17

类似于Mersenne Twister (from Boost.Random)的东西是确定性的。

+0

如果您宁愿避免使用Boost,您可以使用[Mersenne Twister]的原始实现(http://www.math.sci.hiroshima-u.ac.jp/ 〜m-mat/MT/emt.html),这是直写的。近年来,MT集团增加了一些额外的端口,可以使用SIMD,OpenCL和CUDA。 – sfstewman 2013-03-19 18:19:24

+0

看到我的问题和答案C++ 11随机生成器。 C++ 11 mt19937在所有平台上提供了一致的结果,但标准分布并没有,所以我创建了自己的分布式:http://stackoverflow.com/questions/34903356/c11-random-number-distributions-are-not -consistent-across-platforms-what-al – 2016-01-23 11:43:32

0

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

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

0

一个快速一派reference说:

两个使用相同的种子不同的初始化,指示伪随机数发生器产生结果在这两种情况下的后续调用兰特同继承。

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

+0

我相信这是指他对任何特定的`rand()`实现的行为,并且不提供任何交叉编译器或跨平台保证。而且,使用内置的PRNG可能会导致各种不需要的属性。使用已知适合您需求的PRNG库。 – dmckee 2009-05-28 19:00:11

5

我意识到这是一个旧的线程,但现在用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'; 
    } 
} 
1

我一直在simplerandom库这一点。它应该是跨平台的,我也瞄准多种语言。目前它支持C和Python(两种语言生成相同的数字)。我计划在不久之后用C++实现相同的生成器,遵循Boost和C++ 11随机API。