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,
}
コメント