Недавно я решил опробовать новую случайную библиотеку c ++ 11, и одна вещь пришла мне на ум ... избавиться от [rand ()% nelemennts] при выборе случайного элемента из контейнера.Причина в том, что я хочу повторяющуюся генерацию, когда использование rand-инкапсуляции не существует, потому что
auto set_a=generateSet(nelements1); //generateSet calls rand
auto set_b=generateSet(nelements2); //so set_b is determined by the previous line :(
Итак, это то, что я придумал: (обратите внимание, что это не потокобезопасно, оно разработано так, чтобы быть безопасным в некотором смыслечто вызовы generateSet не влияют друг на друга (изменяя состояние внутреннего значения rand))
template<typename container_type,typename element_type >
class RandElemGetter
{
const container_type& containter_ref;
std::uniform_int_distribution<size_t> distribution;
std::mt19937 engine;
public:
RandElemGetter(container_type& container): containter_ref(container),distribution(0,container.size()-1)
{
}
element_type get()
{
return containter_ref[distribution(engine)];
}
};
использование:
{
vector<int> v{1,2,3,1701,1729};
vector<int> result;
RandElemGetter<vector<int>,int> reg_v(v);
for(size_t i=0;i<nelements;++i)
result.push_back(reg_v.get());
}
Так что это нормально?Я знаю, что это не потокобезопасно, это не главное.Мне интересно, есть ли лучший "ограниченный" способ получения случайного элемента из контейнера с произвольным доступом.Это может быть изменено, возможно, с помощью std :: advance, чтобы работать для всех.