Пусть N будет размером общего набора, а K будет размером исключенного набора.
Я зависит от размера набора, из которого вы выбираете. Если исключенный набор намного меньше, чем общий диапазон, просто выберите случайное число, а если оно находится в исключенном наборе, выберите снова. Если мы сохраняем исключенный набор в хеш-таблице, то каждая попытка может быть выполнена за O (1) раз.
Если исключенный набор велик, выберите случайное число R в наборе размера (N - K) и выведите выбор в качестве элемента не исключенных элементов. Если мы храним только дыры в хеш-таблице со значением случайного числа, мы можем сгенерировать это за один образец за время O (1).
Точка среза будет зависеть от размера (N - K) / N, но я подозреваю, что, если это не больше, чем .5 или около того, или если ваши сеты очень малы, просто выборка, пока вы не получите удар, будет быстрее на практике.