2013-09-23 33 views
0

我想弄清楚如何在C++中生成隨機高斯向量。生成隨機高斯數並將它們放入矢量中是否足夠?如何在C++中創建隨機高斯向量?

+2

你需要解釋一下你的高斯矢量的意思。對這些詞我至少有三種不同的解釋。 – Gene

+0

您希望我們使用哪種「矢量」的定義? C++的定義還是數學的? –

回答

0

Boost.Random包括正態分佈生成器。您應該可以使用它來填充矢量。完整的測試示例代碼:

#include <boost/random/random_device.hpp> 
#include <boost/random/normal_distribution.hpp> 
#include <vector> 

int main() 
{ 
    boost::random::random_device rng; 
    boost::random::normal_distribution<> generator(0, 100); 
    std::vector<int> vec; 

    vec.reserve(100); 
    std::generate_n(
     std::back_inserter(vec), 
     100, 
     [&]() { return generator(rng); }); 

    for (auto i : vec) 
     std::cout << i << ','; 

    return 0; 
} 
1

編輯:我才意識到你,或許,在談論多元高斯分佈。在這種情況下,我認爲,您需要N正態分佈,每個正態分佈對應於一個座標中的單變量分佈。然後,通過對每個分佈進行採樣,生成隨機矢量的座標。實際上,使用C++ 11僞隨機數生成(code on ideone.com),下面編輯的代碼表示使用二維隨機矢量座標。請注意,在給出的示例中,兩個座標之間將存在相關性,因爲在連續的僞隨機數之間存在相關性。可以嘗試使用具有兩個發生器的兩個種子,並使用標準庫提供的更復雜的算法。但是,我覺得,即使使用兩種不同的發生器,仍然可能存在相關性 - 必須對此問題進行調查才能給出明確的答案。

#include <iostream> 
#include <vector> 
#include <random> 
#include <iomanip> 

int main() 
{ 
std::random_device device_random_; 
std::default_random_engine generator_(device_random_()); 
std::normal_distribution<> distribution_x_(1.0, 0.5); 
std::normal_distribution<> distribution_y_(10.0, 1.0); 

std::vector<double> vector_x_, vector_y_; 

for (int counter_(0); counter_ < 10; ++counter_) 
{ 
    vector_x_.push_back(distribution_x_(generator_)); 
    vector_y_.push_back(distribution_y_(generator_)); 
    std::cout << std::fixed << std::setprecision(4) << "(" << vector_x_[counter_] 
      << ", " << vector_y_[counter_] << ")\n"; 
} 

return (0); 
} 

程序輸出:

(0.2390, 10.3887) 
(1.1087, 9.5847) 
(1.0920, 9.3468) 
(1.1982, 11.6633) 
(0.8840, 11.0903) 
(0.5573, 8.5121) 
(0.6709, 11.4706) 
(1.1477, 9.4374) 
(0.8778, 11.0323) 
(0.8255, 9.7704)