0

C ++でランダムなガウスベクトルを生成する方法を見つけようとしています。ランダムなガウス数を生成してベクトルに入れるだけで十分でしょうか?

4

2 に答える 2

1

編集:おそらく、多変量ガウス分布について話していることに気づきました。この場合、それぞれが座標の 1 つに沿った一変量分布に対応するN 個の正規分布が必要になると思います。次に、各分布をサンプリングして、ランダム ベクトルの座標を生成します。事実上、以下の編集されたコードは、C++11 疑似乱数生成 ( ideone.com のコード) を使用して、10 個の 2 次元ランダム ベクトルの座標を表します)。与えられた例では、連続する疑似乱数間に相関があるため、2 つの座標間に相関があることに注意してください。標準ライブラリが提供するより洗練されたアルゴリズムを使用して、2 つのジェネレーターで 2 つのシードを使用してみることができます。ただし、2 つの異なるジェネレーターを使用しても、まだ相関関係がある可能性があると思います。明確な答えを得るには、この問題を調査する必要があります。

#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)
于 2013-09-23T01:23:46.287 に答える
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;
}
于 2013-09-23T01:09:32.297 に答える