|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.08.2018, 08:54 | #1 |
Регистрация: 06.05.2016
Сообщений: 7
|
Рандомный выбор из БД
Сразу скажу, я не программист, а учусь для себя, типа хобби...
Имеется вот такой код для рандомного выбора вопроса из БД: Код:
Переменная $new_date. Почему рандом делается именно так? Почему именно дата, а не просто какое-либо число? С текущей датой база вопросов никак не связана. Время загрузки - тоже не причём. Вопросы могут быть загружены, как 10 лет назад, так и минуту... Нигде не могу найти ответ на этот вопрос. И далее - сам рандом. Уж очень он предсказуемый. "Ходит" по группе одних и тех же вопросов, не охватывая всю базу. Это очень заметно, если отвечать на викторину несколько часов подряд. Хоть вопросов в базе около 30000, но выборка идёт не из всего массива и вопросы начинают повторяться через несколько часов работы. Для устранения бага - сделан фикс в виде кнопки "перемешивания". Но это не решает проблему. Просто рандом перескакивает на новый цикл, и снова "бегает по кругу" по одним и тем же вопросам. И ещё, опять тот же рандом. Если загрузить блок новых вопросов - они будут выводиться подряд в том же порядке, как и были загружены. Постепенно, через несколько циклов, новый пакет постепенно "рассасывается" и новые вопросы начинают перемежаться со старыми. Теперь, что я сделал. Протестировав переменную $new_date, я заметил, что дата в ней изменяется очень незначительно. Поэтому попытался сделать рандом более "рандомным" и в большем диапазоне дат: Код:
Но это субьективно. Нет возможности следить за викториной сутками и подсчитывать статистику. Я не прошу решить задачу за меня. Просто объясните, пожалуйста, по принципу работы рандома через дату в этом файле (или дайте ссылку на инфу). Если есть возможность, подскажите как правильно делать выборку из всего массива, без зацикливания. Если же подскажете готовый вариант решения проблемы - буду очень благодарен. Последний раз редактировалось mychatik; 13.08.2018 в 09:19. |
13.08.2018, 09:43 | #2 |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 823
|
А какая задача? Викторина, содержит определенное количество вопросов и надо выбрать N вопросов на раунд? После этого идет следующий раунд вопросов из N вопросов?
Обычно время используют, как seed (источник случайный чисел) для псевдослучайных чисел. Затрудняюсь сказать что хотел сделать программист, но есть подозрение, что он хотел сделать последовательность вопрос не повторяющимися между раундами. На мой взгляд подход так себе. Я бы сделал прямой запрос случайных записей в нужном количестве и все (как-то так).
Не давай организму поблажки, каждый день тренируй его в шашки..
|
13.08.2018, 09:50 | #3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
во-первых, если я правильно понял, то это не код, который выбирает вопросы рандомно (это у Вас другой скрипт делает), это код, который заполняет поле last_use случайной датой, чтобы потом, когда выбирать случайные вопросы, можно было отсортировать по этому полю.
На мой взгляд - крайне неэффективное и плохо работающее решение во-вторых, рекомендую воспользоваться решением отсюда - https://habr.com/post/54176/ // или по ссылке Скарам в-третьих, расширение mysql() в PHP устарело, нужно переходить на PDO() или на mysqli() Последний раз редактировалось Serge_Bliznykov; 13.08.2018 в 09:52. |
13.08.2018, 09:51 | #4 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
С чего вы взяли, что это рандомный выбор?
Я не вижу тут никакого рандома при выборе, только выполнение обычного SELECT (без ORDER BY и т.п.) порядок которого вроде бы не гарантирован в MySQL, но вряд ли сильно рандомный.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
13.08.2018, 09:58 | #5 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Alex11223, мой пост выше отвечает на ваш вопрос...
очень вероятно, что скрипт, где выбираются "случайные" записи, использует сортировку по полю last_use |
13.08.2018, 12:13 | #6 | |||||||
Регистрация: 06.05.2016
Сообщений: 7
|
Цитата:
Если ответили - даётся награда, в зависимости от того, сколько подсказок использовано. Цитата:
То, что это рандом я взял из описания questions randomizer и названия файла randomizer.php Плюс в файле есть рандомное изменение переменной $new_date. Цитата:
Цитата:
Цитата:
Т.е. мой вариант изменения всё-же будет эффективным? Цитата:
Цитата:
Задача-минимум пока выполнена. Сделан перевод с php5.3 на php5.6; php7.0 - это на будущее. Я так думаю, что сервера ещё долго будут поддерживать php5.6. |
|||||||
13.08.2018, 12:20 | #7 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Зачем отвечать не дочитав?
Написали ж Цитата:
Зависит от алгоритма выбора. Скорее всего там просто сортировка по дате, так что не важно, хоть числа по-порядку.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 13.08.2018 в 12:27. |
|
13.08.2018, 12:41 | #8 | |
Регистрация: 06.05.2016
Сообщений: 7
|
Цитата:
Код:
Последний раз редактировалось mychatik; 13.08.2018 в 12:44. |
|
13.08.2018, 13:47 | #9 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
ОНО (отсортировать по случайному полю и взять одну (первую) запись.):
Цитата:
я бы рекомендовал: 1) код, который в randomizer.php вообще не нужен. 2) код, который в get_question замените на простой код для получения случайной записи из таблице (ссылки на примеры кода уже дали). и всё. больше ничего не надо. p.s. похоже этот механизм задуман был для другого - чтобы выпавшие вопросы долго не выпадали.но, имхо, толком это не получилось реализовать. Последний раз редактировалось Serge_Bliznykov; 13.08.2018 в 13:52. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рандомный вывод | GRFed | PHP | 5 | 19.07.2017 09:15 |
Рандомный выбор. | Stranger_465 | Общие вопросы C/C++ | 6 | 04.05.2015 17:50 |
Рандомный текст | Jkeeee | HTML и CSS | 0 | 15.05.2011 15:59 |
Не рандомный рандом ))))) | Junk1E | Общие вопросы C/C++ | 6 | 09.12.2009 18:51 |
Рандомный вывод | Forrest Gamp | Общие вопросы C/C++ | 6 | 10.02.2008 15:03 |