Я только начинаю использовать заголовок С++ 11 <random>
в первый раз, но есть еще некоторые вещи, которые кажутся немного загадочными. Этот вопрос касается предполагаемого, идиоматического, наилучшего способа выполнения очень простой задачи.
В настоящее время в одной части моего кода у меня есть что-то вроде этого:
std::default_random_engine eng {std::random_device{}()};
std::uniform_int_distribution<> random_up_to_A {0, A};
std::uniform_int_distribution<> random_up_to_B {0, B};
std::uniform_int_distribution<> random_up_to_some_other_constant {0, some_other_constant};
а затем, когда мне нужно целое число от 0 до B, я вызываю random_up_to_B(eng)
.
Так как это начинает выглядеть немного глупо, я хочу реализовать функцию rnd
, так что rnd(n, eng)
возвращает случайное целое число от 0 до n.
Что-то вроде следующего должно работать
template <class URNG>
int rnd(int n, URNG &eng) {
std::uniform_int_distribution<> dist {0, n};
return dist(eng);
}
но это связано с созданием нового объекта распределения каждый раз, и у меня создается впечатление, что не так, как вы должны это делать.
Итак, мой вопрос в том, каков наилучший способ выполнения этой простой задачи, используя абстракции, предоставляемые заголовком <random>
? Я спрашиваю, потому что я обязан делать гораздо более сложные вещи, чем это позже, и я хочу убедиться, что я правильно использую эту систему.