2009-03-23 1 views
0

Я работаю над модулем MCQ, и мне нужно получить случайные вопросы из моей базы данных. Проблема в том, что я, кажется, получаю дубликаты.Как я могу генерировать уникальные случайные числа в PHP?

+0

Извинения за состояние гонки редактирования, RichB – ryeguy

+0

@ryeguy: Я откатился, так как я думаю, что у меня есть лучшее редактирование. Не стесняйтесь добавлять на мой. – GEOCHET

+0

часто меняются ваши вопросы или они в основном статичны? –

ответ

6

Если вы извлекаете их из базы данных, используйте SQL для выполнения своей работы. например выборка 20 случайных вопросов (без повторения):

SELECT * FROM questions ORDER BY RAND() LIMIT 20 
0

Без дополнительной информации я могу предложить рудиментарное решение. (но, пожалуйста, уточните свой вопрос с дополнительной информацией)

Я предполагаю, что у вас есть пользователи, потому что тогда вы можете сохранить в таблицу (будь то временную или нет), какие вопросы сказал пользователь уже получил.

Если у вас нет пользователей, вы можете использовать SESSION_ID в качестве идентификатора пользователя для этого пользователя.

Итак, когда вы впервые задаете вопрос, и пользователь отвечает на него, он сохраняет информацию, которую вы должны сохранить, а затем идентификатор пользователя и идентификатор вопроса в таблицу.

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

6

Похоже, вы хотите перетасовать вопросы, а не рандомизировать доступ к ним. Таким образом, ваш алгоритм будет примерно таким.

  1. Получить все вопросы (или вопросы), которые вы хотите отобразить.
  2. Перемешайте их
  3. Получить/отображение в них в порядке перемешиваются

перетасовки проверить: Fisher-Yates shuffle algorithm

1

Если вы используете MySql и у вас есть разумное небольшое количество данных, вы можете использовать ORDER BY RAND()

+0

Другие РСУБД имеют аналогичный синтаксис. Например, я считаю, что вы можете использовать «ORDER BY NEWID()» в MSSQL и «ORDER BY DBMS_CRYPTO.randominteger» в Oracle. –

0

Если у вас есть очень большое количество строк, вы можете добавить столбец в таблицу, которая хранит число между 0 и 1, а затем принести с запросом:

SELECT * FROM `mytable` WHERE `randcolumn` > RAND() LIMIT 20 

Это означает, что вашей базе данных не нужно произвольно заказывать всю таблицу, чтобы предоставить всего 20 строк.