Reputation: 10913
I'm trying to generate select names from a mysql database by using the rand() function in php. The program works fine but is it possible to make the results more random because some of the records that I'm getting is the same(whenever I clear the session and start over again), and others might not get selected. I have currently 91 records in the table.
if(!isset($_SESSION['max'])){
$max = $db->get_var("SELECT COUNT(*) FROM tbl_participants");
$_SESSION['max'] = $max;
}else{
$max = $_SESSION['max'];
}
if(!empty($_GET['clear'])){
$_SESSION['used_up'] = Array();
$_SESSION['names'] = Array();
}
//print_r($_SESSION['used_up']);
$current_number = rand(0, $max);
$exists = check_existing($current_number, $_SESSION['used_up']);
if($exists == 2){
$_SESSION['used_up'][] = (int)$current_number;
$name = $db->get_var("SELECT participant FROM tbl_participants WHERE participant_id='$current_number'");
$_SESSION['names'][] = $name;
foreach($_SESSION['names'] as $k=>$v){
echo '<li>'.$v.'</li>';
}
}
function check_existing($item, $array){
if(in_array($item, $array)){
return 1;
}else{
return 2;
}
}
Upvotes: 0
Views: 343
Reputation: 6850
According to PHP manual there is no need to seed the random number generator (at least since PHP 4.2.0). So it should return different number every time the php script is run. You can try to use also mt_rand(), but I don't think it will give you better randomness then rand(). The manual just says that it is 4x faster and that on some old libc versions the rand() was buggy - but I think that was written long time ago.
How many records do you need? You can just use SELECT * FROM table ORDER BY rand() LIMIT 5
, however that can be slow if you have many large records in table (1000+).
If you have only 91 records it is quite possible that sometimes the generator will generate the same number again. For code on how to generate X unique random numbers, you can check answers to this question: Generating UNIQUE Random Numbers within a range - PHP
Upvotes: 2
Reputation: 25204
Try mt_rand instead of rand. (http://php.net/manual/en/function.mt-rand.php)
Edit:
A gentleman in this post:
What is the best way to generate a random key within PHP?
suggested using
sha1(microtime(true).mt_rand(10000,90000))
Upvotes: 5