2013-09-23 3 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

EDIT: Я просто понял, что вы, вероятно, говорить о многомерном гауссовском распределении. В этом случае, я думаю, вам понадобятся нормальные распределения, каждый из которых соответствует одномерному распределению вдоль одной из координат. Затем вы генерируете случайный вектор 's координаты путем выборки каждого из распределений. Эффективно отредактированный код ниже представляет координаты 10 двумерных случайных векторов, используя генерацию псевдослучайных чисел 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) 
Смежные вопросы