読者です 読者をやめる 読者になる 読者になる

正規分布の代わりに区間線形分布を使うのもいいかも

中央値(平均値)から、最小値と最大値に向けて左右対称で線形に出現確率が低くなるようなものには、std::piecewise_linear_distributionを使うのがよさそう。

std::normal_distributionは、与えるパラメータが平均値と標準偏差で、「平均値 ± 標準偏差」を超える値も出現するから、その外れ値を望まない場合に、std::piecewise_linear_distributionで代用できそう。

これは、正規分布がほしい、という状況ではなく、中央値付近の値がほしい、という状況です。

#include <random>
#include <array>
#include <fstream>

int main()
{
    std::random_device seed_gen;
    std::mt19937 engine(seed_gen());

    std::array<double, 3>
        intervals = {-1.0, 0.0, 1.0},
        densities = { 0.0, 1.0, 0.0};

    std::piecewise_linear_distribution<double> dist {
        intervals.begin(),
        intervals.end(),
        densities.begin()
    };

    std::ofstream file("dist.tsv");
    for (std::size_t n = 0; n < 1000 * 1000; ++n) {
        double result = dist(engine);
        file << result << "\n";
    }
}

f:id:faith_and_brave:20141226140153p:plain

参照