C++ | vector を乱数で初期化する

C++ にて vector を乱数で初期化するためのサンプルコードです。

一様乱数で初期化

長さ10の vector を、メルセンヌツイスターの一様乱数で初期化する例です。
ここでは、0.0 以上 1.0 未満の乱数を生成しています。

#include <algorithm>
#include <random>
#include <iostream>
#include <iterator>

int main()
{
    size_t n = 10;
    std::vector<double> v(n);

    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());

    // [0, 1) - 0 以上 1 未満の分布
    std::uniform_real_distribution<double> dist{0.0, 1.0};

    auto rng = [&engine, &dist]()
    {
        return dist(engine);
    };

    std::generate(v.begin(), v.end(), rng);

    // 生成した乱数を標準出力
    std::copy(v.begin(), v.end(), std::ostream_iterator<double>(std::cout, ", "));
    std::cout << std::endl;
    // 0.560438, 0.247104, 0.601757, 0.131019, 0.946299, 0.737606, 0.7367, 0.408397, 0.474216, 0.818366, 
}

正規分布乱数で初期化

dist インスタンスの型を変更することで、乱数分布をコントロールすることができます。

normal_distribution 型を利用することで、正規分布の乱数を生成することができます。
第1引数が平均、第2引数が標準偏差になります。

#include <algorithm>
#include <random>
#include <iostream>
#include <iterator>

int main()
{
    size_t n = 10;
    std::vector<double> v(n);

    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());

    // 平均 0, 標準偏差 1 の正規分布
    std::normal_distribution<double> dist{0.0, 1.0};

    auto rng = [&engine, &dist]()
    {
        return dist(engine);
    };

    std::generate(v.begin(), v.end(), rng);

    // 生成した乱数を標準出力
    std::copy(v.begin(), v.end(), std::ostream_iterator<double>(std::cout, ", "));
    std::cout << std::endl;
    // 0.675291, -0.192547, -1.57471, -1.02882, -0.764603, 1.23606, 0.334688, 1.13035, -1.48913, -0.164681, 
}
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次