|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Добрый день. Есть задача генерации лотерейных билетов. Один билет 6 цифр. Билетов 500 000. Комбинация номеров должна быть уникальна, причем: 1 5 6 9 8 11 25 это равно 5 25 1 6 9 8 11, т.е. порядок не имеет значения. Если ехать простым for или через linq по массивам, получается очень долго, т.к. каждый раз надо проверять, есть ли совпадения в комбинациях или нет и если есть, комбинацию надо перегенерировать. Исходя из этого вопрос, есть ли какой-то более быстрый способ проверки наличия набора значений в массиве данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 09:52 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
25 и 11 - это цифры? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 10:10 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Проверяй не каждую цифру а хеш отсортированной строки, например "156981125".GetHashCode() в массиве хешей уже созданных билетов. думаю ускорит. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 10:19 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Первое, что в голову пришло: отсортировать, сформировать строку "1 5 6 9 8 11 25", взять от неё хэш и использовать в качестве ключа комбинации. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 10:20 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
dzone, только разделитель между цифрами в строке нужен :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 10:21 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
izoldov-roskini, Вы не поняли задачу, лотерейные билеты - один билет имеет идентификатор из шесть цифр пример 000001, 0000002 и тд. задача простая от 0 до 500 000 простой инкремент, забить пустые регистры нулями. То что вы написали 1 5 6 9 8 11 25, вы будете удивлены но тут 9 цифр, они никак не укладываются в ваше задание. Вы путаете число с цифрой, номер это также комбинация из цифр, уникальность номера тут можно развести холивар ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 10:29 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
skyANA, массив случайных цифр от 1 1 1 1 1 1 1 до 9 9 9 9 9 9 9 или просто цифр и потом их перемешать не? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 10:32 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Взаимоисключающие условия. Если "причем: 1 5 6 9 8 11 25 это равно 5 25 1 6 9 8 11", то будет и 1 2 3 4 5 6 равно 6 5 4 3 2 1,etc. Что уменьшает количество возможных комбинаций в разы. (0 0 0 0 0 1 = 0 0 0 0 1 0 = 0 0 0 1 0 0 = 0 0 1 0 0 0 = 0 1 0 0 0 0 = 1 0 0 0 0 0). Так что Вы определитесь - у Вас там 6 ЦИФР или 6 ЧИСЕЛ? И уже после этого задавайте вопрос, как Вам сгенерить случайный массив. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 12:29 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
dzoneПроверяй не каждую цифру а хеш отсортированной строки, например "156981125".GetHashCode() в массиве хешей уже созданных билетов. думаю ускорит. Да, возможно это ускорит, я тоже думал про хеши, попробую ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 12:52 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Где-то в степиizoldov-roskini, Вы не поняли задачу, лотерейные билеты - один билет имеет идентификатор из шесть цифр пример 000001, 0000002 и тд. задача простая от 0 до 500 000 простой инкремент, забить пустые регистры нулями. То что вы написали 1 5 6 9 8 11 25, вы будете удивлены но тут 9 цифр, они никак не укладываются в ваше задание. Вы путаете число с цифрой, номер это также комбинация из цифр, уникальность номера тут можно развести холивар Я говорю не о номере билета, а о игровой комбинации, я в первом посте все верно написал ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 12:53 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
izoldov-roskiniДобрый день. Есть задача генерации лотерейных билетов. Один билет 6 цифр. Билетов 500 000. Комбинация номеров должна быть уникальна, причем: 1 5 6 9 8 11 25 это равно 5 25 1 6 9 8 11, т.е. порядок не имеет значения. Если ехать простым for или через linq по массивам, получается очень долго, т.к. каждый раз надо проверять, есть ли совпадения в комбинациях или нет и если есть, комбинацию надо перегенерировать. Исходя из этого вопрос, есть ли какой-то более быстрый способ проверки наличия набора значений в массиве данных?Отвечая на заданный вопрос - есть: использовать упорядоченные массивы. Другое дело, что, ИМХО, практичнее сначала сгенерировать 500000 неповторяющихся чисел, каждое из которых потом превращать в набор номеров. Или сразу использовать процесс генерации, в принципе не допускающий повторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 12:56 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
izoldov-roskiniДобрый день. Есть задача генерации лотерейных билетов. Один билет 6 цифр ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:05 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Abstraction, вы определитесь, что есть цифра, что есть число - это разные понятия. вы блондинка? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:08 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Abstraction, извиняюсь, это не вам, а ТС ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:09 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Где-то в степиAbstraction, вы определитесь, что есть цифра, что есть число - это разные понятия. *вежливо* Спасибо, я в общих чертах в курсе. Слезьте уже с белого носорога. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:12 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Abstraction, значит вы блондинка, если в общих чертах а по теме что вы виртуально представляете никакой тут рандоминизации и проверок не надо просто простой инкримент 1,2,3,4,5,6 7,8,9,10,11,12 .......... .......... uint.max(); ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:18 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Abstraction, я по моему извинился перед вами, что запостил ответ вместо автору вам. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:20 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Где-то в степиAbstraction, значит вы блондинка, если в общих чертах а по теме что вы виртуально представляете никакой тут рандоминизации и проверок не надо просто простой инкримент 1,2,3,4,5,6 7,8,9,10,11,12 .......... .......... uint.max();Подсказка: номера в лото и подобных играх обычно ограничены сверху - раз, комбинации должны быть случайными - два. Хотя ТС обо всём этом предоставляет догадываться отвечающим, да. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:22 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Abstraction, в том то и дело, что автор не указал ничего, и что у него цифры и число и номер, это одно и тоже. ЕГЭ еще не то с людьми может сделать )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:25 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
izoldov-roskiniДобрый день. Есть задача генерации лотерейных билетов. Один билет 6 цифр. Билетов 500 000. Комбинация номеров должна быть уникальна, причем: 1 5 6 9 8 11 25 это равно 5 25 1 6 9 8 11, т.е. порядок не имеет значения. Если ехать простым for или через linq по массивам, получается очень долго, т.к. каждый раз надо проверять, есть ли совпадения в комбинациях или нет и если есть, комбинацию надо перегенерировать. Исходя из этого вопрос, есть ли какой-то более быстрый способ проверки наличия набора значений в массиве данных? Ты бы лучше ссылку на правила проведения лотереи дал, они должны быть доступны, чем пытаться своими словами излагать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 13:34 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
AbstractionГде-то в степиAbstraction, значит вы блондинка, если в общих чертах а по теме что вы виртуально представляете никакой тут рандоминизации и проверок не надо просто простой инкримент 1,2,3,4,5,6 7,8,9,10,11,12 .......... .......... uint.max();Подсказка: номера в лото и подобных играх обычно ограничены сверху - раз, комбинации должны быть случайными - два. Хотя ТС обо всём этом предоставляет догадываться отвечающим, да. если число ограничить двумя порядками , и требовать что бы в массиве не повторялось число ( оно было бы уникальным для всего массива массивов) задача вообще не имеет решения ибо мы сможем получить только 99/6 массивов и все.... что имел ввиду автор, так и осталось загадкой.... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 16:04 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
По поводу использования GetHashCode(), не годится: Код: sql 1.
Это из MSDN, выход я нашел, делаем строку вида 1 2 3 4 45 26 15 и заталкиваем в массив, а потом просто проверяем наличие строки в массиве, Hash тут в принципе не нужен ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 16:06 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Где-то в степиAbstractionпропущено... Подсказка: номера в лото и подобных играх обычно ограничены сверху - раз, комбинации должны быть случайными - два. Хотя ТС обо всём этом предоставляет догадываться отвечающим, да. если число ограничить двумя порядками , и требовать что бы в массиве не повторялось число ( оно было бы уникальным для всего массива массивов) задача вообще не имеет решения ибо мы сможем получить только 99/6 массивов и все.... что имел ввиду автор, так и осталось загадкой....Что должны быть уникальные комбинации. Поскольку числа обычно от 1 до 90, то имеем 622614630 возможных вариантов. Также, полагаю, автор хочет, чтобы вероятности возникновения в серии каждого из возможных вариантов были с хорошей точностью равны, корреляция варианта с номером билета отсутствовала, корреляция вариантов на соседних билетах отсутствовала. Будет не лень - вечером напишу алгоритм за линейное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 16:23 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
Abstraction, понял, если автор под цифрой имеет ввиду число а их в билете 6 чисел, то почему он везде в примерах оперирует таким видом . "Комбинация номеров должна быть уникальна, причем: 1 5 6 9 8 11 25 это равно 5 25 1 6 9 8 11, т.е. порядок не имеет значения" тут же везде по семь чисел? и второе, имхо было бы правильно делать выравнивание нулем, ну а так параллели и словарь. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 16:35 |
|
Перебор 500 000 строк
|
|||
---|---|---|---|
#18+
izoldov-roskiniПо поводу использования GetHashCode(), не годится: Код: sql 1.
Это из MSDN, выход я нашел, делаем строку вида 1 2 3 4 45 26 15 и заталкиваем в массив, а потом просто проверяем наличие строки в массиве, Hash тут в принципе не нужен Чёт вы не то написали. Вот если числа отсортировать по возрастанию(1 2 3 4 15 26 45) , то тогда потом действительно можно просто сравнивать строки. А какая у вас лотерейная система? Что это 6 из 49 + доп.число + суперчисло или 6 из 45 просто или ещё какая? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2012, 16:40 |
|
|
start [/forum/topic.php?fid=20&tid=1405371]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
84ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
others: | 330ms |
total: | 531ms |
0 / 0 |