如何在c ++中创建随机高斯向量?

时间:2013-09-23 01:01:33

标签: c++

我试图找出如何在c ++中生成随机高斯向量。生成随机高斯数并将它们放在向量中是否足够?

2 个答案:

答案 0 :(得分:1)

编辑:我刚刚意识到你可能正在讨论多变量高斯分布。在这种情况下,我认为,您需要 N 正态分布,每个分布对应于沿其中一个坐标的单变量分布。然后,通过对每个分布进行采样来生成随机向量的坐标。实际上,下面编辑的代码使用C ++ 11伪随机数生成(code on ideone.com)表示10个二维随机向量坐标。注意,在给出的示例中,两个坐标之间将存在相关性,因为在连续的伪随机数之间存在相关性。可以尝试使用两个种子和两个生成器,标准库提供更复杂的算法。但是,我觉得,即使使用两种不同的发生器,仍然可能存在相关性 - 人们必须调查这个问题才能给出明确的答案。

#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)

答案 1 :(得分: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;
}