Есть ли функция для генерации случайного числа с использованием треугольного распределения в C ++? - PullRequest
0 голосов
/ 15 апреля 2019

Я ищу функцию в c ++, которую я даю ей (min, mode, max), затем она возвращает случайное число, сгенерированное треугольным распределением.Если есть код для реализации этой функции, это будет очень хорошо.

1 Ответ

1 голос
/ 15 апреля 2019

std::piecewise_linear_distribution можно использовать для моделирования треугольного распределения.

Вот пример, основанный на примере кода на связанной странице cppreference, которая генерирует треугольное распределение, которое генерирует числа от 0 до 30 с пиком в 20:

#include <random>
#include <iostream>
#include <iomanip>
#include <array>
#include <map>

std::piecewise_linear_distribution<double> triangular_distribution(double min, double peak, double max)
{
    std::array<double, 3> i{min, peak, max};
    std::array<double, 3> w{0, 1, 0};
    return std::piecewise_linear_distribution<double>{i.begin(), i.end(), w.begin()};
}

int main() {
    std::random_device rd;
    // create a mersenne twister PRNG seeded from some implementation-defined random source
    std::mt19937 gen(rd());

    // create a triangular distribution with a minimum of 0, a peak at 20, and a maximum of 30
    auto dist = triangular_distribution(0, 20, 30);

    std::map<int, int> hist;

    // use our distribution to generate 10,000 random numbers
    // (truncated to integers for the sake of output; the generated numbers are actually real numbers)
    for (int i = 0; i < 10000; ++i) {
        double num = dist(gen);
        ++hist[num];
    }

    // print out a nice histogram of the numbers generated
    for(auto p : hist) {
        std::cout << std::setw(2) << std::setfill('0') << p.first << ' '
            << std::string(p.second/10,'*') << '\n';
    }
}

Возможный вывод:

00 **
01 *****
02 ******
03 ************
04 **************
05 ******************
06 **********************
07 *************************
08 **************************
09 *********************************
10 ************************************
11 **************************************
12 *************************************
13 ********************************************
14 **************************************************
15 **************************************************
16 *******************************************************
17 *******************************************************
18 ************************************************************
19 *****************************************************************
20 **************************************************************
21 *******************************************************
22 ************************************************
23 *******************************************
24 ***************************************
25 ******************************
26 **************************
27 ****************
28 ***********
29 ***
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...