Вы можете скопировать ключи std::map<char, int>
в std::vector<char>
. Затем перемешайте этот вектор с std::random_shuffle
X . Наконец, верните num
элементов карты: те, чьи ключи являются num
последними ключами в векторе:
std::vector<std::pair<char, int>> pick_random(const std::map<char, int>& m, size_t num)
{
std::vector<char> keys;
keys.reserve(m.size());
// copy the map's keys
std::transform(m.begin(), m.end(), std::back_inserter(keys),
[](const std::pair<const char, int>& p) {
return p.first;
}
);
// shuffle the keys
std::random_shuffle(keys.begin(), keys.end());
// number of elements to pick
num = std::min(num, m.size());
std::vector<std::pair<char, int>> res;
res.reserve(num);
// pick num elements
std::generate_n(std::back_inserter(res), num,
[&keys, &m]() {
auto it = m.find(keys.back());
keys.pop_back();
return *it;
}
);
return res;
}
Идея состоит в том, чтобы случайным образом перемешать элементы в векторе, содержащие ключи ( т.е. keys
). Поэтому вы перетасовываете ключи, которые сопоставляются с элементами на карте. Вы используете эти случайно перемешанные ключи для случайного получения элементов с карты.
X или std::shuffle
вставлено, поскольку std::random_shuffle
устарело в C ++ 14 и удалено в C ++ 17.