Для std::unordered_set<int> s
:
1) принять случайным образом R
в min(s)..max(s)
2) если R
in s
: вернуть R
3)
newIter = s.insert(R).first;
newIter++;
if (newIter == s.end()) {
newIter = s.begin();
}
auto result = *newIter;
s.erase(R);
return result;
Для упорядоченного множества (std :: set) вероятность будет зависеть от расстояния между элементами. unordered_set рандомизирован по хешу.
Надеюсь, это поможет.
PS преобразование std::set<V>
в std::set<std::pair<int, V>>
(где первый элемент в паре - хэш второго) делает этот метод подходящим для любого хэшируемого V.