экспоненциальное распределение есть, чтобы сгенерировать случайное число следующего определенным распределением. Чтобы использовать экспоненциальное распределение, вы делаете что-то вроде этого:
#include <iostream>
#include <boost/random.hpp>
int main() {
boost::mt19937 seed(5u);
boost::variate_generator<boost::mt19937&, boost::exponential_distribution<>> random_n(seed, boost::exponential_distribution<>()) ;
cout << random_n() << endl; return 0;
}
Теперь, я подозреваю, что вы хотите сделать что-то, но это не так ясно для меня. Вы хотите сортировать или что-то еще? Выберите случайное число в вашем векторе?
Редактировать: OK. Короче говоря, даже если у вас есть доступ к C++ 11, вы не можете зайти очень далеко. Большая часть случайного генератора теперь находится в стандарте. Но не PDF. Если вам интересно, почему: вот оно: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1398.html. Итак, вам определенно нужен инструментарий boost.math, это единственный способ вычислить ваш PDF-файл. Вот некоторые примеры код для вас:
#include <boost/math/distributions/exponential.hpp>
int main() {
const auto lbda = 1.0;
const auto d = exponential_distribution<> { lbda };
cout << pdf(d, 0) << endl; // e(0) = 1
cout << pdf(d, 1) << endl; // e(-1) = 0.3678
return 0;
}
Короче говоря: для использования подталкивания PDF
, вам не нужен сам по себе вектору вызвать функцию PDF знает, как вычислить его распределение.
Редактировать 2: Если вам нужно заполнить вектор некоторым дистрибутивом, вы можете просто использовать std::generate
и применить к нему дистрибутив, вот пример с std::exponential_distribution
(C++ 11, но вы можете использовать boost) ,
std::vector<float> v(20);
random_device rd;
mt19937_64 gen(rd());
exponential_distribution<float> dis(1);
auto rand = bind(dis, gen);
generate(begin(v), end(v), rand);
for (auto& e : v) cout << e << endl;
код я показываю здесь, заполняющие vector
из 20 элементов с экспоненциальным распределением. Вы можете переключиться на std::array
, изменить поплавок на все, что вам нужно, увеличить размер вектора или массива.
Вы также можете взглянуть на эту старую C++-библиотеку (ныне pytonic), которая делает то, что вам нужно: http://myfitter.hepforge.org/. Вероятно, это ваш лучший выбор. Он использует непараметрический метод. Версия C++ довольно старая, и я не настолько уверен в полном функциональности, но, возможно, это пойдет вам.
AFAIK boost имеет * нет метода * для подгонки данных к распределению, только для генерации данных. Я помню, что в Numerical Recipes есть бот для вашего здравомыслия. Надеюсь, вы найдете лучший вариант. вы можете, например, запишите все элементы, затем примените линейную регрессию. – peterchen