До того, как понял, что предложенный мной вариант мне немного не подходит, делал так...
Может кому пригодится...
1) Допустим, нужно сгенерировать купон типа 314420-ABG
2) Генерируем рандомно число от 65 до 90 (=65)
3) Генерируем первую букву из ascii (=А)
4) Отнимаем от кода буквы 64 (65-64=1)
5) Умножаем 1х2 = 2
6) Переводим это число в радианы: 2*пи/180 = 0,03 (с округлением)
7) Узнаем остаток этого числа после комы (=03)
8) Разбиваем число на две части: 0 и 3
9) Получаем первое (3) и последнее (0) число из числового набора
10) Умножаем эти числа и додаем 14 (результат всегда будет двузначным = 14)
11) Раскладываем это число на отдельные числа 1 и 4. Это будет второе (1) и четвертое (4) число из числового набора
12) Умножаем 1-е, 2-е и 4-е число (=12). Разбиваем на отдельные символы (1, 2). Узнаем кто из них больше (=2). Это и будет наше 5-е число из числового набора.
13) Генерируем случайно вторую букву (66=B)
14) Отнимаем 64 = 2
15) abs(cos(2)) = 0.41
16) узнаем первое число после комы (4)
17) Это и будет наше последнее, 3е число из числового ряда.
18) Последняя буква тоже генерируется рандомно. Но она для красоты :)
Проверяем код, в таком же порядке, как и генерировали. Если на каком-то этапе возникла ошибка, значит код недействительный.
Минус такой генерации купонов в том, что один купон можно использовать бесконечное количество раз. Это как лицензионный ключ.