2014-10-22 86 views
3

我們已經在我們的項目中使用了boost :: random。最近,一個失敗的測試單元引起了我對其中一個屬性的興趣:根據所使用的分佈,在不同版本的Boost上生成的數字序列可能會有所不同。使用boost :: random的平臺隨機生成一致隨機數

此行爲在所有發行版中似乎並不一致。大多數情況下,使用具有相同種子的RNG的均勻分佈產生相同的結果。其他分佈如normal,lognormal,binomialdiscrete可能會顯示出這些差異。

我已經把一個簡單的C++程序,顯示問題:

#include <iostream> 
#include <boost/random.hpp> 
#include <stdint.h> 

void uniform() { 
    uint32_t seed = 42; 
    boost::mt19937 rng(seed); 
    boost::random::uniform_real_distribution<double> distro(0., 1.); 
    std::cout << "uniform" << std::endl; 
    for (int i=0; i<10; ++i) { 
    std::cout << distro(rng) << std::endl; 
    } 
} 

void normal() { 
    uint32_t seed = 42; 
    boost::mt19937 rng(seed); 
    boost::random::normal_distribution<double> distro(0., 1.); 
    std::cout << "normal" << std::endl; 
    for (int i=0; i<10; ++i) { 
    std::cout << distro(rng) << std::endl; 
    } 
} 

void discrete() { 
    uint32_t seed = 42; 
    boost::mt19937 rng(seed); 
    std::vector<double> P; 
    P.push_back(0.3); 
    P.push_back(0.4); 
    P.push_back(0.3); 
    boost::random::discrete_distribution<uint64_t> distro(P.begin(), P.end()); 
    std::cout << "discrete" << std::endl; 
    for (int i=0; i<10; ++i) { 
    std::cout << distro(rng) << std::endl; 
    } 
} 

int main() { 
    uniform(); 
    normal(); 
    discrete(); 
} 

這個簡單的程序會顯示不同的數字序列升壓1.56(OSX上運行):

uniform 
0.37454 
0.796543 
0.950714 
0.183435 
0.731994 
0.779691 
0.598658 
0.59685 
0.156019 
0.445833 
normal 
-0.638714 
-0.836808 
-0.400566 
-0.869232 
-0.972045 
-0.758932 
-1.30435 
1.22996 
0.249399 
0.286848 
discrete 
1 
2 
2 
1 
0 
0 
0 
2 
1 
2 

或者使用Boost 1.50(在Ubuntu 12.10上運行):

uniform 
0.37454 
0.796543 
0.950714 
0.183435 
0.731994 
0.779691 
0.598658 
0.59685 
0.156019 
0.445833 
normal 
-1.25821 
1.2655 
0.606347 
-0.19401 
-0.196366 
-1.72826 
-1.09713 
-0.783069 
0.604964 
0.90255 
discrete 
2 
1 
2 
1 
1 
0 
1 
1 
0 
1 

請注意,均勻分佈分類如預期那樣工作:即,相同的種子在兩個版本上產生一致的數字序列。正常和離散分佈的行爲不一樣。

有沒有辦法「解決」這個?即有不同的平臺獨立於升壓版本生成完全相同的序列?

+2

這裏明顯的谷歌查詢是「提升bug正態分佈」。田田。 – 2014-10-22 11:46:27

+1

我在Mac OS X Boost 1.55上試過了你的代碼,並得到了與你的Ubuntu和Boost 1.50相同的結果。我有點期待與你的其他結果相匹配!但是現在我們可以從@ HansPassant的提示中看到https://svn.boost.org/trac/boost/ticket/9513這是一個存在高達1.55的bug,並在之後修復。 – 2014-10-22 11:46:59

+0

感謝您的意見和鏈接。請注意,這不是唯一的問題。我已經擴展了這個例子,以便它也顯示了離散分佈的問題。 – 2014-10-22 12:05:01

回答

1

看起來boost :: random並不能保證你獲得不同版本提升的某些種子的相同數字序列。

E.g.在1.56版本他們已經改變的算法,以產生從所述Box-Muller方法正常分佈的隨機數的方法Ziggurat

https://github.com/boostorg/random/commit/f0ec97ba36c05ef00f2d29dcf66094e3f4abdcde

這種方法速度較快,但也產生不同數量的序列。

其他分佈可能也發生了類似的變化。均勻分佈依然會產生相同的結果,默認情況下,基本rng是mersenne twister 19937的輸出。