I am working on a MCQ module and I need to fetch random questions from my database. The problem is that I seem to get duplicates.
-
Apologies for the edit race condition, RichB – ryeguy Mar 23 '09 at 16:39
-
@ryeguy: I rolled back, as I think I have a better edit. Feel free to add on to mine. – GEOCHET Mar 23 '09 at 16:39
-
do your questions change often, or are they mostly static? – Greg Dean Mar 23 '09 at 16:54
-
@Greg — Well, if this one is any indication… ;-) – Ben Blank Mar 23 '09 at 17:15
-
Looks like what you have is a database question, not a PHP question, depending how you want to execute this, please tell us what database you are using. – TravisO Mar 23 '09 at 19:06
6 Answers
Sounds like you want to shuffle the questions, not randomize access to them. So your algorithm would be something like this.
- Get the all question (or question keys) you want to display.
- Shuffle them
- Retrieve/ display in them in the shuffled order
for shuffling check out: Fisher-Yates shuffle algorithm

- 29,221
- 14
- 67
- 78
If you're fetching them from database, use SQL to do your job. e.g. fetching 20 random questions (without repeating):
SELECT * FROM questions ORDER BY RAND() LIMIT 20

- 131,205
- 36
- 218
- 244
If you're using MySql and you have reasonable small amount of data, you can use ORDER BY RAND()

- 73,842
- 19
- 118
- 155
-
Other RDBMSes have similar syntax. For example, I believe you can use "ORDER BY NEWID()" in MSSQL and "ORDER BY DBMS_CRYPTO.randominteger" in Oracle. – Ben Blank Mar 23 '09 at 17:19
Without any more info i can suggest a rudimentary solution. (but please update your question with more info)
I'm guessing you have users, because then you could save into a table (be it temporary or not), what questions said user has already gotten.
If you don't have users, you can use the SESSION_ID
as a user identifier for that user.
So when you fetch a question for the first time, and the user answers it, it saves the info you need to save, and then the user's id and the question's id into a table.
When fetching the next question, you do a check to see if the user has that question id in this new table.

- 68,817
- 22
- 142
- 198
See Do stateless random number generators exist?
Any sequence of pseudo-random numbers will eventually repeat. How you obtain your pseudo-random numbers?
If you have a very large number of rows you can add a column to the table which stores a number between 0 and 1 and then fetch with a query:
SELECT * FROM `mytable` WHERE `randcolumn` > RAND() LIMIT 20
This means that your database doesn't have to randomly order the entire table to provide just 20 rows.

- 57,804
- 13
- 114
- 132