2009-07-10 226 views
8

我想知道如果在C++標準庫中有任何高斯分佈數字生成器,或者如果你有任何代碼段傳遞。C++:生成高斯分佈

在此先感謝。

+0

AC代碼片段可用於類似的,[稍後的問題(點擊這裏)](http://stackoverflow.com/questions/17995894/normalgaussian-distribution-function-in-c/23609868#23609868) – jcollomosse 2014-05-12 13:46:56

回答

15

標準庫沒有。然而,Boost.Random的確如此。如果我是你,我會使用它。

6

GNU科學圖書館具有此功能。 GSL - Gaussian Distribution

+0

「將有「? – jalf 2009-07-10 13:55:22

+0

大聲笑,我寫了之前,我擡起頭的答案...我想我應該改變它:) – 2009-07-10 14:37:53

13

C++技術報告1增加了對隨機數生成的支持。因此,如果您使用的是相對較新的編譯器(visual C++ 2008 GCC 4.3),則可能是開箱即用的。

請參閱here瞭解std::tr1::normal_distribution(以及更多)的樣本用法。

+1

如果它還沒有,你可以找到它作爲Boost的一部分:http://www.boost。組織/ DOC /庫/ 1_39_0/DOC/HTML/boost_tr1/subject_list.html#boost_tr1.subject_list.random – stephan 2009-07-10 14:55:15

4

此問題的答案隨C++ 11更改,其中包含random header,其中包括std::normal_distribution。沃爾特布朗的文章N3551, Random Number Generation in C++11可能是這個圖書館更好的介紹之一。

下面的代碼說明了如何使用該標頭(see it live):

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

int main() 
{ 
    std::random_device rd; 

    std::mt19937 e2(rd()); 

    std::normal_distribution<> dist(2, 2); 

    std::map<int, int> hist; 
    for (int n = 0; n < 10000; ++n) { 
     ++hist[std::floor(dist(e2))]; 
    } 

    for (auto p : hist) { 
     std::cout << std::fixed << std::setprecision(1) << std::setw(2) 
        << p.first << ' ' << std::string(p.second/200, '*') << '\n'; 
    } 
} 

我提供的實施例以隨機數產生在C++ 11在回答一個更一般的設置爲C++ random float number generation與例如在Boost中也使用rand()