В некоторых приложениях моделирования требуется распределение с определенным местоположением и масштабом: часто это приравнивается к определенному среднему и стандартному отклонению, хотя для многих распределений связь между этими свойствами и параметрами местоположения и масштаба нетривиальна. См.http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htmдля получения дополнительной информации.
Очевидный способ справиться с этим - через шаблон адаптера:
template <class Dist>
class scaled_distribution
{
scaled_distribution(
const Dist dist,
typename Dist::value_type location,
typename Dist::value_type scale = 0);
};
Который затем будет иметь свой собственный набор перегрузок для функций, не являющихся членами.
Легко добавить объект распределения, который виртуализирует фактический тип распределения, и поэтому может содержать «любой» объект, который соответствует концептуальным требованиям распределения:
template <class RealType>
class any_distribution
{
public:
template <class Distribution>
any_distribution(const Distribution& d);
};
template <class RealType>
RealType cdf(const any_distribution<RealType>& d, RealType x);
Такой класс облегчит написание нешаблонного кода, который может работать с любым типом распределения.
УтилитаStatistical Distribution Explorerдля Windows является примером использования.
Пока неясно, есть ли убедительный вариант использования. Возможно, тесты на пригодность могут обеспечить такой вариант использования: это требует дополнительного изучения.
Тесты более высокого уровня, примерно соответствующиеТесты гипотез математикиУпаковка может быть добавлена достаточно легко, например:
template <class InputIterator>
typename std::iterator_traits<InputIterator>::value_type
test_equal_mean(
InputIterator a,
InputIterator b,
typename std::iterator_traits<InputIterator>::value_type expected_mean);
Возвращает вероятность того, что данные в последовательности [a,b] имеют среднееожидаемое_среднее.
Аккумуляторный каркас Эрика Ниблера— тоже работает — предоставляет средства для вычисления различных статистических свойств из экспериментальных данных. Существует возможность интегрировать статистические тесты с этой структурой на более позднем этапе:
accumulator_set<double, features<tag::test_expected_mean> > acc(expected_mean=4);
acc = std::for_each(mydata.begin(), mydata.end(), acc);
double p = probability(acc);