我正在尝试使用php中的rand()函数从mysql数据库生成选择名称。该程序工作正常但是可以使结果更随机,因为我得到的一些记录是相同的(每当我清除会话并重新开始),而其他记录可能不会被选中。我目前有91条记录。
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 :(得分:5)
尝试使用mt_rand而不是rand。 (http://php.net/manual/en/function.mt-rand.php)
编辑:
这篇文章中的一位先生:
What is the best way to generate a random key within PHP?
建议使用
SHA1(microtime中(真).mt_rand(10000,90000))
答案 1 :(得分: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