2012-01-05 79 views
0

我試圖通過在php中使用rand()函數來從mysql數據庫生成選擇名稱。該程序工作正常,但有可能使結果更隨機,因爲我得到的一些記錄是相同的(每當我清除會話,並重新開始),其他人可能不會被選中。我目前在表格中有91條記錄。在php中生成隨機數

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; 
    } 
} 
+0

第一個錯誤:$ current_number = rand(0,$ max);需要爲$ current_number = rand(0,$ max-1);甚至更好$ current_number = mt_rand(0,$ max-1); – 2012-01-05 11:24:34

+0

而不是從check_existing()返回1和2,爲什麼不簡單地返回布爾值TRUE或FALSE? – 2012-01-05 11:25:48

+0

@MarkBaker:感謝您的建議,我會更新我的代碼。 – user225269 2012-01-05 11:33:22

回答

2

根據PHP手冊,不需要爲隨機數生成器生成種子(至少從PHP 4.2.0開始)。所以每次運行php腳本時都應該返回不同的數字。你也可以嘗試使用mt_rand(),但我認爲它不會給你更好的隨機性,然後rand()。手冊只是說它速度快了4倍,而在一些舊的libc版本上,rand()卻是越野車 - 但我認爲這是很久以前寫的。

你需要多少條記錄?您可以使用SELECT * FROM table ORDER BY rand() LIMIT 5,但是如果您在表(1000+)中有很多大記錄,則速度可能會很慢。

如果您只有91條記錄,則很可能有時發生器會再次生成相同的數字。有關如何生成X個唯一隨機數的代碼,可以查看此問題的答案:Generating UNIQUE Random Numbers within a range - PHP