Алгоритм генерации номера карточки

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 11:08

Интересует как "правильно" сгенерировать 14 значные номера? Таких номеров нужно, скажем 100 000. Карточки нужны для пополнения счета в нашей локальной сети, которую мы внедряем.
Под словом "правильно" подразумеваю то, как это делаю, скажем, теже операторы мобильной связи.
На данный момент использую Randomize + Rnd.
Последний раз редактировалось JohnK 04.06.2009 (Чт) 14:08, всего редактировалось 1 раз.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Re: Алгоритм генерации номера карточки

Сообщение CodeName33 » 04.06.2009 (Чт) 11:21

Тут ИМХО правильнее использовать 2 части:
Одна часть должна содержать некий каунтер, который будет увеличиваться на 1 у каждой новой карточки, чтобы избежать случайного повтора номера.
Вторая часть будет содержать случайные данные, чтобы было не подделать просто так.
Лучше перемешивать первую часть среди второй, или кодировать, чтобы каунтер не был виден явным образом.
Программисты не глючат - глючат компиляторы...

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 11:35

Я генерирую следующим образом:
00 0000 0000 0000 - каждый элемент ( разделенный пробелом) случайно генерируется, затем полученное 14х значное число проверяется на повторение.
Мне кажется это слишком просто, хотя с другой стороны попробуй подбери с 3 попыток! :wink:
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 14:42

Было бы хорошо услышать ваши идеи, может у кого был опыт генерирования кодов пополнения?
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Re: Алгоритм генерации номера карточки

Сообщение CodeName33 » 04.06.2009 (Чт) 14:51

JohnK писал(а):...каждый элемент ( разделенный пробелом) случайно генерируется, затем полученное 14х значное число проверяется на повторение...


Теоретически, это может вызвать зависание программы на неопределённое время, если он будет много раз генерировать уже имеющиеся коды. Чтобы этого избежать, как раз каунтер и вводится.
Программисты не глючат - глючат компиляторы...

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 15:02

У меня 100 000 номеров генерятся приблизительно 2-3 минуты. На форме разместил прогрессбар, так что на зависание стало меньше похоже :wink:
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм генерации номера карточки

Сообщение Хакер » 04.06.2009 (Чт) 15:06

Я надеюсь не надо говорит, что проверку на повторение нужно делать не тупым сравнением текущего ключа со всеми ранее сгенерированными ключами?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 15:22

А как еще можно?
P.s. Именно так и делаю
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм генерации номера карточки

Сообщение Хакер » 04.06.2009 (Чт) 15:24

Ужас. Сейчас, генерируя 100000-ный ключ, тебе нужно произвести 99999 x 14 сравнений. Не много ли? Есть техника, позволяющая произвести максимум 14 сравнений. Выигрышь: в 99999 раз меньше лишних действий.

Найди мой топик о Krm и Dfa, где мой подход раскртиковали.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм генерации номера карточки

Сообщение Хакер » 04.06.2009 (Чт) 16:16

Да куда там Krm, его использование будет оправдано когда каждому ключу сопоставлены ещё-какие то данные, и надо, имея ключ, за минимальное время найти и получить сопоставленные данные.

А так пойдёт обычный массив.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 16:24

Почитал твои выкладки, и решил, что лучше я подожду лишних 3-5 минут, чем разбираться и отлаживать описанную методу
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Re: Алгоритм генерации номера карточки

Сообщение CodeName33 » 04.06.2009 (Чт) 16:32

JohnK писал(а):Почитал твои выкладки, и решил, что лучше я подожду лишних 3-5 минут, чем разбираться и отлаживать описанную методу


По идее можно проще сделать, через коллекции, т.е. добавлять в коллекцию элемент с ключем - кодом, предварительно проверив, есть ли там такой элемент. Коллекции быстрее сработают, чем тупой перебор массива.

Ну или индексировать массив и бинарным поиском искать.
Программисты не глючат - глючат компиляторы...

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 16:35

Ребята! Вопрос не о том как перебрать массив. Вопрос, как генерировать номера наиболее грамотно.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Алгоритм генерации номера карточки

Сообщение alibek » 04.06.2009 (Чт) 17:22

Наиболее грамотно — генерировать все возможные значения (10^14), после чего из полученного набора извлекать нужное количество случайных записей.
Также можно генерировать численные последовательности на основе GUID и использовать их.
Генерировать ключ и проверять, что он уникален (а в случае неуникальности генерировать еще раз) можно, но только в том случае, когда число нужных значений значительно меньше числа возможных значений.
Lasciate ogni speranza, voi ch'entrate.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 17:30

Так я и делаю... :)
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Алгоритм генерации номера карточки

Сообщение Debugger » 04.06.2009 (Чт) 18:19

Можно совместить случайное число с уникальным номером. Ну, например, старшие 24 бита обозначают случайное число, все остальное - нормер карточки.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 04.06.2009 (Чт) 18:32

CodeName33 уже предлагал такой вариант, вариант интересный.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Алгоритм генерации номера карточки

Сообщение awl100Alex » 05.06.2009 (Пт) 0:22

JohnK писал(а):На данный момент использую Randomize + Rnd.

http://bbs.vbstreets.ru/viewtopic.php?p=6715278#p6715278
JohnK писал(а):Вопрос, как генерировать номера наиболее грамотно.

Если копнуть теорию...

"...К каким же выводам пришел Д. Кнут? Проанализировав огромный фактический материал, он показывает, что алгоритм или закон, заложенный в генератор случайных чисел, неизбежно проявит себя в том, что последовательность случайных чисел начнет повторяться циклически, т.е. перестанет быть случайной с некоторого момента. В пределах одного цикла последовательность случайна, но длина любого цикла конечна. Невозможно придумать алгоритм, цикл которого был бы бесконечен. Всегда наступает такой момент времени, после которого числа начнут повторяться.
Таким образом, Д. Кнут подтверждает правоту высказывания Дж. фон Неймана: "Всякий, кто питает слабость к арифметическим методам получения случайных чисел, грешен вне всяких сомнений" (1951г)."


Исходя из этого, тебе нужно в инете поискать примеры готовых алгоритмов-генераторов с максимально большим циклом повторений. Тогда, возможно, отпадет необходимость выполнять проверку на уникальность.
Вот тут есть кое-что, но, к сожалению, о периоде цикла последнего алгоритма четко не сказано. Но если поищешь, то, наверняка найдешь. :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм генерации номера карточки

Сообщение Хакер » 05.06.2009 (Пт) 0:27

По-моему, всё это неактуально в данном случае.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 05.06.2009 (Пт) 0:40

awl100Alex До этого поста я некоторое время пытался найти алгоритмы, но всякий раз натыкался на программы для развода людей (коды пополнение опрераторов моб связи)
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 05.06.2009 (Пт) 0:53

Вообщем на данный момент своял программу генерации 14 значных чисел, пока пойдет. Дальше планирую RND + Shift bits. Думаю сделать таким образом 5 разных алгоритмов и каждую партию карточек делать одним из них. Но, если у вас есть свежие идеи, с удовольствием послушаю.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Алгоритм генерации номера карточки

Сообщение awl100Alex » 05.06.2009 (Пт) 9:40

JohnK
Свежих идей нет - потому что они все уже давно не свежие, а давно разжеванные и изученные полностью. Поищи инфу в литературе по "Теории вероятности" или "Криптографии".

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 07.06.2009 (Вс) 9:44

awl100Alex "Спасибо" за содержательный ответ.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Алгоритм генерации номера карточки

Сообщение awl100Alex » 07.06.2009 (Вс) 21:37

JohnK
Скачай эту книгу...
http://www.goldbook.ws/2006/04/09/Donald_EH__Knut__Iskusstvo_programmirovanija___.html
Там ниже есть ссылки на deposit.
Цитирую...
"Во втором томе представлена теория получисленных алгоритмов. В отдельные главы вынесено описание процесса генерации случайных чисел и способов работы с ними в вычислительной среде".
Или здесь, третья ссылка через ifolders...
http://itbookz.ru/nodata/nodataprog/4946-.html
Алгоритм Д.Г.Лехмера, например. Этим теоремам и исследованиям уже, как там пишут - 100 лет. Поэтому и говорю тебе, что ничего нового нет. Почитай, изучи, поговори со знакомыми математиками для разьясниния деталей и пиши свой генератор карточек. :)

trash
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 113
Зарегистрирован: 28.01.2009 (Ср) 12:09

Re: Алгоритм генерации номера карточки

Сообщение trash » 08.06.2009 (Пн) 17:05

Интересно, зачем изобретать такие корявые велосипеды, если в mssql есть newid и уникальные ключи?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Алгоритм генерации номера карточки

Сообщение Хакер » 08.06.2009 (Пн) 17:25

Интересно, ты будешь читать тему полностью, прежде чем отвечать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Алгоритм генерации номера карточки

Сообщение JohnK » 10.06.2009 (Ср) 12:46

Долго читал. Много думал....
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 94

    TopList