Я работаю над модулем MCQ, и мне нужно получить случайные вопросы из моей базы данных. Проблема в том, что я, кажется, получаю дубликаты.Как я могу генерировать уникальные случайные числа в PHP?
ответ
Если вы извлекаете их из базы данных, используйте SQL для выполнения своей работы. например выборка 20 случайных вопросов (без повторения):
SELECT * FROM questions ORDER BY RAND() LIMIT 20
Без дополнительной информации я могу предложить рудиментарное решение. (но, пожалуйста, уточните свой вопрос с дополнительной информацией)
Я предполагаю, что у вас есть пользователи, потому что тогда вы можете сохранить в таблицу (будь то временную или нет), какие вопросы сказал пользователь уже получил.
Если у вас нет пользователей, вы можете использовать SESSION_ID
в качестве идентификатора пользователя для этого пользователя.
Итак, когда вы впервые задаете вопрос, и пользователь отвечает на него, он сохраняет информацию, которую вы должны сохранить, а затем идентификатор пользователя и идентификатор вопроса в таблицу.
При получении следующего вопроса вы проверяете, имеет ли пользователь этот идентификатор вопроса в этой новой таблице.
Похоже, вы хотите перетасовать вопросы, а не рандомизировать доступ к ним. Таким образом, ваш алгоритм будет примерно таким.
- Получить все вопросы (или вопросы), которые вы хотите отобразить.
- Перемешайте их
- Получить/отображение в них в порядке перемешиваются
перетасовки проверить: Fisher-Yates shuffle algorithm
Если вы используете MySql и у вас есть разумное небольшое количество данных, вы можете использовать ORDER BY RAND()
Другие РСУБД имеют аналогичный синтаксис. Например, я считаю, что вы можете использовать «ORDER BY NEWID()» в MSSQL и «ORDER BY DBMS_CRYPTO.randominteger» в Oracle. –
См Do stateless random number generators exist?
любой последовательности псевдослучайных чисел, даже повторить. Как вы получаете свои псевдослучайные числа?
Если у вас есть очень большое количество строк, вы можете добавить столбец в таблицу, которая хранит число между 0 и 1, а затем принести с запросом:
SELECT * FROM `mytable` WHERE `randcolumn` > RAND() LIMIT 20
Это означает, что вашей базе данных не нужно произвольно заказывать всю таблицу, чтобы предоставить всего 20 строк.
Извинения за состояние гонки редактирования, RichB – ryeguy
@ryeguy: Я откатился, так как я думаю, что у меня есть лучшее редактирование. Не стесняйтесь добавлять на мой. – GEOCHET
часто меняются ваши вопросы или они в основном статичны? –