Допустим вам нужен диапазон S1 = [0, k) | (k, N].
Используйте распределение в диапазоне S2 = [0, N - 1]. А затем результат преобразуйте с помощью отображения f: S2 -> S1.
В вашем случае f это функция:
f(x) = if (x >= 3) x + 1 else x
mt19937 gen(time(0));
uniform_int_distribution<int> uid(1, 9);
int f(int n) {
if (n >= 3)
return n + 1;
else
return n;
}
int i = f(uid(gen));
Я вижу два варианта:
- генерировать число проверять не равно ли "3" или не находится ли в области "3" и перегенерировать по необходимости. всё это в цикле.
-- подвариант первого варианта, сразу нагенерировать большую последовательность и N элементов, а когда оттуда будешь их брать пропускать невалидные, как кончилась или есть свободное время у процесса догенерить новых
- и второй вариант. Случайно выбирать поддиапазон [1, 3) или (3,10], учитывая что они разного размера и уже в нём получать число.
Второй вариант дает постоянное время работы, хотя и с большим средним.