С таким небольшим диапазоном, если вы должны идти с одним или другим (а не комбинацией обоих), вам, вероятно, лучше вести список неиспользованных номеров. Ну, на самом деле это зависит от того, что вы ожидаете, что ваш верхний предел использования будет пропорционален общим возможным значениям.
Если вы ожидаете низкой плотности, то, вероятно, вам лучше всего выбрать случайное число и сравнить его с существующими. Ваш уровень столкновений будет достаточно низким, чтобы не влиять на производительность.
Если вы ожидаете высокую плотность, лучше сохранить список неиспользуемых чисел и сделать случайный выбор из этого, потому что альтернатива может быть просто ужасна. В худшем случае, когда остается только одно число, использование подхода с низкой плотностью означает, что вам нужно сгенерировать и выбросить половину чисел в диапазоне, чтобы иметь 50% -ный шанс найти неиспользуемое.
Наилучший подход заключается в переключении подходов по мере заполнения диапазона; при использовании 50% вы, вероятно, найдете пригодное число в течение двух поколений случайных чисел; но в какой-то момент наполненности (когда оставшихся чисел немного) лучше переключиться.
Но лучший подход - не использовать случайные числа для значений id; приведенные выше примеры еще более усложняются тем, что приходится сталкиваться с условиями гонки, когда несколько клиентов баз данных могут бороться за один и тот же неиспользованный идентификатор компании.