Вы не говорите, для чего используются цифры. Есть ли у них какая-то ценность, связанная с ними? Будет ли проблемой, если пользователи смогут выяснить схему и угадать действительные номера билетов?
Если для этих чисел важно угадать, эта схема рушится; что-то, что выводит данные, которые выглядят действительно случайными, было бы лучше. Вы можете взять монотонно увеличивающийся серийный номер и зашифровать его с помощью блочного шифра (с размером блока 64 бита); это дает вам 64-битный вывод или около 20 десятичных цифр, которые вы могли бы взять (скажем) последние 18 из. (Если важна обратимость, т. Е. Учитывая номер билета, который вы хотите, чтобы иметь возможность восстановить серийный номер, вам необходимо быть здесь более осторожным.)
Вам нужна чугунная 100% гарантия того, что номера билетов никогда не будут прежними? Если это так, вам нужно сохранить их в базе данных и пометить их при использовании. Если вы сделаете это, может быть разумно просто использовать хороший генератор случайных чисел и каждый раз проверять наличие дупликов.