Я думаю, ваше первое требование (не сохранение каждого промокода в базе данных) проблематично.
Вопрос в том, разрешено ли использовать один промокод несколько раз?
Еслиэто не разрешено, тогда вам все равно нужно хранить уже выкупленные коды в каком-то постоянном хранилище данных, так почему бы не сохранить сгенерированные коды в хранилище постоянных данных с самого начала вместе с флагом, указывающим, был ли он погашен или нет?
Если вы не хотите хранить все коды / не можете сохранить все коды, вы все равно можете использовать Random
с начальным числом, уникальным для вашей текущей кампании:
long seed = 20190921065347L; // identifies your current campaign
Random r = new Random(seed);
for (int i = 0; i < numCodes; i++) {
System.out.println(r.nextLong());
}
или
long seed = 20190921065347L; // identifies your current campaign
Random r = new Random(seed);
r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L)
.forEach(System.out::println);
Чтобы узнать, является ли код действительным, вы можете сгенерировать те же самые коды снова:
long seed = 20190921065347L; // identifies your current campaign
Random r = new Random(seed);
System.out.println(
r.longs(numCodes, 100_000_000_000_000L, 1_000_000_000_000_000L)
.anyMatch(l -> l == 350160558695557L));