Сортировка в случайном порядке | |
---|---|
Dron2003 Автор Сообщений: 81 Дата регистрации: 14.11.2008 |
Всем привет!
Ребята, натолкните на мысль. Есть таблица 20 записей, надо вывести эти записи в форму в случайном порядке, причем, в следующий раз опять их все перемешать. Пробовал через генератор случайного числа в диапазоне от 1 до 20, то получается хорошо для вывода 10-13 записей. А если вывести все 20, что процесс формирования затягивался на 20-30 минут. Да, надо чтобы те записи которые уже выведены на экран больше не выводились. Т.е. нужна сортировка в случайном порядке. |
Re: Сортировка в случайном порядке | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Приложи программку, которая 20 минут выводит 20 записей...
|
Re: Сортировка в случайном порядке | |
---|---|
Dron2003 Автор Сообщений: 81 Дата регистрации: 14.11.2008 |
Ну, примерно так:
Исправлено 1 раз(а). Последнее : Dron2003, 31.01.18 10:27 |
Re: Сортировка в случайном порядке | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Например, использовать курсор с дополнительным полем, которое заполнить случайными числами, затем вывести отсортированный по этому полю курсор.
Что-то вроде
Исправлено 3 раз(а). Последнее : ry, 31.01.18 10:47 |
Re: Сортировка в случайном порядке | |
---|---|
Dron2003 Автор Сообщений: 81 Дата регистрации: 14.11.2008 |
Беда в том, что генератор случайного числа очень часто повторяет одну и туже цифру.
|
Re: Сортировка в случайном порядке | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Занимательный код... Преобразовал, чтобы можно пробовать:
|
Re: Сортировка в случайном порядке | |
---|---|
Dron2003 Автор Сообщений: 81 Дата регистрации: 14.11.2008 |
я его выдернул из модуля где выборка идет 20 вопросов из 40 билетов. Работает очень быстро, но если выбирать из 20 билетов... то зависнуть может надолго.
|
Re: Сортировка в случайном порядке | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Вот так можно получить неповторяющийся случайный набор чисел в нужном диапазоне
|
Re: Сортировка в случайном порядке | |
---|---|
Dron2003 Автор Сообщений: 81 Дата регистрации: 14.11.2008 |
Супер! Спасибо!
|
Re: Сортировка в случайном порядке | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Гораздо проще:
Всё прочее - это горе от ума (и потому г*нокод ). ------------------ WBR, Igor |
Re: Сортировка в случайном порядке | |
---|---|
ry Сообщений: 2113 Дата регистрации: 24.09.2007 |
Да, легко и красиво, а я чего-то засомневался в том, как поведет себя rand() в запросах. Крайне редко пользовался этой функцией.
|
Re: Сортировка в случайном порядке | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
И, между прочим, небезосновательно. При использовании rand() в запросах порой получаются странные результаты. Вот, например:
P.S. Так как написал Игорь, конечно же писать можно. |
Re: Сортировка в случайном порядке | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Да, вероятно в этом случае фокс ошибочно полагает RAND() за детерминированную функцию после первого вычисления выражения, и далее уже не вычисляет его.
------------------ WBR, Igor |
Re: Сортировка в случайном порядке | |
---|---|
leonid Сообщений: 3204 Откуда: Рига Дата регистрации: 03.02.2006 |
Ну, как видно из примера, он не вычисляет ее только в том случае, если при первом прогоне rand() выдала значение меньше 0.5. В противном случае вполне себе вычисляет. |
Re: Сортировка в случайном порядке | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну так если на первом прогоне WHERE даёт .F. то ошибочно приняв функцию за детерминированную можно тупо "выйти из цикла" - не делать более ни одного теста. А уж если там .T. то приходится делать остальные прогоны - и там уже фокс вынужден постоянно вычислять WHERE выражение. Полноценной поддержки детерминированных функций (равно как и просто средств указать что некоторая функция таки "чистая") в фоксе нет, увы.
Кстати, фоксу достаточно легко можно указать на "недетерминированность" выражения. Самое простое: rand()+f1 < 0.5+f1 или даже совсем уж "глупое" rand()+f1-f1 < 0.5 - и уже никаких "предположений" он не делает - честно считает каждый раз. Ну или завернуть RAND() в свою UDF - даже однострочную с RETURN RAND() - и тоже он уже не помышляет про такого рода "оптимизацию" ------------------ WBR, Igor |
© 2000-2024 Fox Club  |