2009-05-28 82 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。