Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Вычисление количества возможных вариантов ключа


Автор: Беспечный 6.7.2011, 12:10
Есть некий алгоритм генерации лицензионного ключа, состоящего из символьных блоков и содержащего некие случайные символы из заданного набора. Параметры генерации следующие:
1) количество блоков
2) размер блока
3) символ разделителя блоков (всегда присутствует)
4) набор символов, представляющий собой список флагов: upper case ("ABCD..."), lower case ("abcd..."), digits ("1234..."), symbols ("!@#$%*[];?()")
5) позиция статического блока
6) содержимое статического блока
В пределах одного блока символы не повторяются.

Для примера зададим следующие параметры:
1) 5
2) 4
3) "-"
4) upper case + digits
5) 1
6) "TEST"

С этими параметрами генератор выдаст ключ, к примеру, такой: TEST-4D3G-PE8M-WDMO-IEU7

Этот алгоритм реализован, теперь нужен другой алгоритм, высчитывающий количество всех возможных вариантов лицензионных ключей при определенных параметрах. В комбинаторике не силен, поэтому требуется помощь smile

Автор: Akina 6.7.2011, 12:29
Вычти из количества блоков количество статических блоков? получи количество генерируемых блоков K.
Посчитай длину словаря L.
Пусть размер блока M.
Тогда вариантов блока L! / (M! * (L-M)!) = Z
Вариантов ключа - Z в степени K.

Автор: Беспечный 6.7.2011, 13:16
Если К - количество блоков без учета статического, а статический блок (если он задан) может быть только один, то сколько вариантов будет с учетом статического блока?

Автор: Беспечный 6.7.2011, 14:20
Реализовал подсчет - для проверки задаю такие параметры: кол-во блоков - 1, размер блока - 2, набор символов - только цифры. Нетрудно в уме посчитать, что при таком раскладе алгоритм должен выдавать 81 вариант: 90 двухсимвольных вариантов (от 10 до 99) за вычетом 9-ти повторяющихся (11, 22, 33, etc). Однако, формула возвращает мне значение 45... Похоже, здесь не берутся в расчет такие значения, как например 21 и 12. А мне они нужны.

Автор: volatile 7.7.2011, 02:31
Цитата(Беспечный @  6.7.2011,  14:20 Найти цитируемый пост)
Нетрудно в уме посчитать, что при таком раскладе алгоритм должен выдавать 81 вариант: 90 двухсимвольных вариантов (от 10 до 99) за вычетом 9-ти повторяющихся (11, 22, 33, etc). 

а почему варианты 01, 02, 03 и т.д. пропустили?
они при таком раскладе также должны учитываться и это будет называться http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5
n!/(n-k)! = 10!/(10-2)! = 90

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)