У меня есть программа, которая требует экспоненциально распределенных случайных чисел. Я использую поддержку библиотеки случайных чисел и распределений C ++ 11.
У меня есть раздача: std::exponential_distribution<double> exp_dis(lambda);
lambda
любое значение для начала. 0.0
или же 1.0
все в порядке значения для использования.
Я ссылаюсь на это распределение в функции потока, используя указатель. (У меня есть независимое распределение для каждой функции потока, чтобы избежать условий гонки данных.)
Значение lambda
вычисляется в цикле и может изменяться при каждом выполнении цикла.
Поэтому я хотел бы знать, как значение параметра lamda
может быть «установлен» в экспоненциальном распределении.
После некоторых быстрых поисков, я думаю, я смогу сделать это, используя функцию-член param()
, но я не могу понять точный синтаксис для использования.
Это не работает:
// Pointer to exponential distribution object
exp_dis_p->param(lambda);
Вы также можете изменить lambda
для вашего экспоненциального распределения следующим образом.
template<typename T>
void set_new_lambda(std::exponential_distribution<T> *exp_dis, T val)
{
typename std::exponential_distribution<T>::param_type new_lambda(val);
exp_dis->param(new_lambda);
}
И можете использовать его следующим образом
int main()
{
std::exponential_distribution<double> exp_dis(0.1);
std::cout<<exp_dis.lambda()<<'\n';
set_new_lambda(&exp_dis,0.2);
std::cout<<exp_dis.lambda()<<'\n';
return 0;
}
Или, может быть, если вы имеете дело только с двойным типом, вы можете сделать следующее.
int main()
{
std::exponential_distribution<double> exp_dis(0.1);
auto ptr = &exp_dis;
std::exponential_distribution<double>::param_type new_lambda(0.2);
ptr->param(new_lambda);
}
И вы можете видеть это param_type
для распространения может быть объявлен как std::exponential_distribution<double>::param_type
,
С помощью следующего вы сможете установить новую лямбду:
decltype(exp_dis_p->param()) new_lambda (lambda);
exp_dis_p->param(new_lambda);
Это код, который я использую с некоторого времени. Как объяснил Praetorian в комментариях, тип param () имеет те же аргументы, что и родительский тип.
Я нашел это об этом в документ о стандартизации C ++:
Для каждого из конструкторов D берут аргументы, соответствующие
Параметры распределения P должны иметь соответствующий
конструктор подчиняется тем же требованиям и принимает аргументы
идентичны по количеству, типу и значениям по умолчанию. Более того, для каждого из
функции-члены D, которые возвращают значения, соответствующие
Параметры распределения, P должен иметь соответствующий член
функция с одинаковым именем, типом и семантикой.
С D является классом распределения, а P является типом, названным связанным с D param_type.
decltype
функция просто:
Проверяет объявленный тип объекта или запрашивает тип и категорию значения выражения.