PROFESSOR
PROFESSOR

Reputation: 924

How can I generate unique random numbers in PHP?

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.

Upvotes: 0

Views: 3633

Answers (6)

David Snabel-Caunt
David Snabel-Caunt

Reputation: 58371

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.

Upvotes: 0

vartec
vartec

Reputation: 134631

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

Upvotes: 6

Ólafur Waage
Ólafur Waage

Reputation: 70001

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.

Upvotes: 0

cdonner
cdonner

Reputation: 37668

See Do stateless random number generators exist?

Any sequence of pseudo-random numbers will eventually repeat. How you obtain your pseudo-random numbers?

Upvotes: 0

soulmerge
soulmerge

Reputation: 75724

If you're using MySql and you have reasonable small amount of data, you can use ORDER BY RAND()

Upvotes: 1

Greg Dean
Greg Dean

Reputation: 30077

Sounds like you want to shuffle the questions, not randomize access to them. So your algorithm would be something like this.

  1. Get the all question (or question keys) you want to display.
  2. Shuffle them
  3. Retrieve/ display in them in the shuffled order

for shuffling check out: Fisher-Yates shuffle algorithm

Upvotes: 6

Related Questions