C ++: генерировать гауссовское распределение

Я хотел бы знать, есть ли в стандартных библиотеках C ++ генератор чисел гауссовского распределения или есть ли у вас какой-либо фрагмент кода, который нужно передать.

Заранее спасибо.


person puccio    schedule 10.07.2009    source источник
comment
Фрагмент кода AC доступен в аналогичном более позднем вопросе (нажмите здесь)   -  person jcollomosse    schedule 12.05.2014


Ответы (4)


В стандартной библиотеке этого нет. Однако Boost.Random делает это. Я бы использовал это на вашем месте.

person jalf    schedule 10.07.2009

В C ++ Technical Report 1 добавлена ​​поддержка генерации случайных чисел. Поэтому, если вы используете относительно недавний компилятор (Visual C ++ 2008 GCC 4.3), скорее всего, он доступен прямо из коробки.

См. здесь для примера использования std::tr1::normal_distribution (и многих других).

person Community    schedule 10.07.2009
comment
Если его еще нет, вы также можете найти его как часть Boost: boost.org/doc/libs/1_39_0/doc/html/boost_tr1/ - person stephan; 10.07.2009

Эта функция есть в научных библиотеках GNU. GSL - распределение по Гауссу

person Matt Price    schedule 10.07.2009
comment
Лол, я написал это до того, как нашел ответ ... Думаю, мне стоит его изменить :) - person Matt Price; 10.07.2009

Ответ на этот вопрос меняется в C ++ 11, который имеет случайный заголовок. который включает std :: normal_distribution. Статья Уолтера Брауна N3551, Генерация случайных чисел в C ++ 11 вероятно, одно из лучших введений в эту библиотеку.

Следующий код демонстрирует, как использовать этот заголовок (посмотреть вживую):

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

int main()
{
    std::random_device rd;

    std::mt19937 e2(rd());

    std::normal_distribution<> dist(2, 2);

    std::map<int, int> hist;
    for (int n = 0; n < 10000; ++n) {
        ++hist[std::floor(dist(e2))];
    }

    for (auto p : hist) {
        std::cout << std::fixed << std::setprecision(1) << std::setw(2)
                  << p.first << ' ' << std::string(p.second/200, '*') << '\n';
    }
}

Я предоставляю более общий набор примеров генерации случайных чисел в C ++ 11 в своем ответе на Генерацию случайных чисел с плавающей запятой в C ++ с примером в Boost, а также с использованием rand().

person Shafik Yaghmour    schedule 09.10.2014