c ++ 11 — C ++ Как мне установить параметр объекта `std :: exponential_distribution`?

У меня есть программа, которая требует экспоненциально распределенных случайных чисел. Я использую поддержку библиотеки случайных чисел и распределений 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);

2

Решение

Вы также можете изменить 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,

2

Другие решения

С помощью следующего вы сможете установить новую лямбду:

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 функция просто:

Проверяет объявленный тип объекта или запрашивает тип и категорию значения выражения.

0

По вопросам рекламы [email protected]