2009-11-06 147 views
3

好的庫我在尋找已知庫,能夠生成C,C++和Java的非均勻分佈的隨機數。產生不均勻的僞隨機數

感謝

+0

的http://計算器。 com/questions/1534285/non-uniform-random-number-generator-implementation和http://stackoverflow.com/questions/977354/generating-non-uniform-random-numbers等等。這裏沒有封閉的形式分佈的特殊情況:http://stackoverflow.com/questions/423006/how-do-i-generate-points-that-match-a-histogram – dmckee 2009-11-07 01:29:41

回答

2

的GNU科學圖書館(GSL),http://www.gnu.org/software/gsl/,提供了大量的非均勻分佈的隨機 - 參見手冊中的「隨機數分佈」的第19章。 (統一的隨機數發生器在第17章「隨機數發生」中)。該實現是在C.

3

對於Java,一種選擇是我的Uncommons Maths庫。它支持均勻,高斯,二項式,泊松和指數分佈。有一個WebStart demo,所以你可以看到它的作用。

2

看一看Alglib's implementations,他們有幾種語言來實現一些基本的分佈。

+0

這個鏈接指向算法的幾個分佈函數的計算,但我沒有找到任何算法來計算從分佈中抽取的隨機數。 – 2009-11-07 06:02:22

+0

是的,的確如此,您必須使用單獨的RNG。例如,invpoissondistribution(k,rng.nextDouble())會給你帶參數k的泊松變量。 – 2009-11-07 09:44:26

0

Numerical Recipe小號討論了隨機數生成器的幾個算法。

+0

其實我已經寫了一些隨機數發生器的算法:Box-Muller,Rejection method等等。所以我只是在尋找具有聲譽的庫來生成非均勻分佈的強隨機數 – 2009-11-07 00:19:05

1

Boost具有相當廣泛的選擇隨機數的產生,再加上通過幾個分佈來過濾這些的能力。

0

隨着C++ 11有很多可用於在random頭產生非均勻僞隨機數新的選擇。下面的代碼示例演示了一些可能的非均勻分佈可能的:使用正常分佈,你會看到

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

int main() 
{ 
    std::random_device rd; 

    std::mt19937 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::lognormal_distribution<> dist(1.6, 0.25); 
    //std::exponential_distribution<> dist(1); 

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

輸出與此類似:

-5 
-4 
-3 
-2 * 
-1 *** 
0 ****** 
1 ******** 
2 ********* 
3 ******** 
4 ****** 
5 *** 
6 * 
7 
8 
9